基于ajax和jsonp的原生封装(实例)

我来详细讲解“基于ajax和jsonp的原生封装(实例)”的完整攻略。

什么是AJAX和JSONP?

AJAX是Asynchronous JavaScript and XML(异步的JavaScript和XML)的缩写,指的是一种在不重新加载整个页面的情况下,通过JavaScript进行局部刷新的技术。AJAX可以实现异步请求后端数据,在不影响页面正常操作的情况下,动态刷新页面内容,提升用户的交互体验。

JSONP是JavaScript Object Notation with Padding(使用填充的JavaScript对象表示法),是一种使用JSON格式的数据交换方式。由于浏览器的同源策略限制,我们不能跨域请求非本站的后端数据,而JSONP利用的是动态创建script标签,不受同源策略限制,可以跨域请求数据。JSONP的原理是通过动态创建script标签,将请求的接口及参数作为src的查询字符串传入,后端返回的数据是一段可执行的JavaScript代码,该代码会被自动执行,从而实现了跨域获取数据。

封装AJAX方法

下面,我们来封装一下基于AJAX的GET和POST请求方法。这里的代码示例是基于ES6的语法编写的。

// 封装GET方法
function ajaxGet(url, callback){
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.onreadystatechange = function(){
    if(xhr.readyState === 4 && xhr.status === 200){
        callback(JSON.parse(xhr.responseText));
    }
  };
  xhr.send();
}

// 封装POST方法
function ajaxPost(url, data, callback){
  const xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  xhr.onreadystatechange = function(){
    if(xhr.readyState === 4 && xhr.status === 200){
        callback(JSON.parse(xhr.responseText));
    }
  };
  xhr.send(JSON.stringify(data));
}

代码解析:
- ajaxGet函数接收两个参数:url为请求的接口地址,callback为请求成功后的回调函数。
- ajaxPost函数接收三个参数:url为请求的接口地址,data为请求参数,callback为请求成功后的回调函数。其中data是一个对象,需要用JSON.stringify方法将其转换成字符串。
- 通过XMLHttpRequest对象发送请求。
- readyState为4时表示请求已成功处理。
- status为200时表示请求已成功响应。

封装JSONP方法

接下来,我们来封装一个基于JSONP的方法。

function jsonp(url, options) {
    //创建script标签
    let script = document.createElement('script');
    let callback;
    //格式化options,将其转换成queryString
    options = options || {};
    options.callback = options.callback || ('jsonp_' + Date.now() + '_' + Math.random().toString().substr(2));
    let params = [];
    for(let key in options) {
        params.push(encodeURIComponent(key) + '=' + encodeURIComponent(options[key]));
    }
    //将params数组用&连接成queryString
    let queryString = params.join('&');
    url = url + '?' + queryString;
    script.setAttribute('src', url);
    document.head.appendChild(script);

    return new Promise((resolve) => {
        //定义callback函数,并将数据resolve出去
        window[options.callback] = function (data) {
            resolve(data);
        };
        //当script标签加载完成时,移除script标签并删除callback函数
        script.onload = () => {
            document.head.removeChild(script);
            delete window[options.callback];
        };
    });
}

代码解析:
- jsonp函数接收2个参数:url为请求的接口地址,options是一个对象,可以指定回调函数、请求的参数等。
- 通过动态创建script标签,并指定接口地址和回调函数名称。
- 将options对象转换成queryString,并拼接到接口地址后面。
- 定义了一个Promise用于处理返回的响应结果。
- 在window对象下定义callback函数,并将响应数据resolve出去。
- 在script标签加载完成后,移除script标签并删除callback函数。

AJAX和JSONP的使用示例

现在我们来使用刚才封装好的方法,发送AJAX和JSONP请求,并在回调函数中输出请求结果。

// 发送AJAX请求并输出响应结果
ajaxGet('https://api.apiopen.top/getJoke?page=1&count=2', function(data){
    console.log(data);
});

// 发送JSONP请求并输出响应结果
jsonp('https://api.apiopen.top/getJoke', {
    page: 1,
    count: 2
}).then(data => {
    console.log(data);
});

代码解析:
- ajaxGet函数中调用了封装好的ajaxGet方法,发送AJAX请求并在回调函数中输出响应结果。
- jsonp函数中调用了封装好的jsonp方法,发送JSONP请求并在Promise中处理响应结果。

本文总结

通过阅读本文,我们了解了AJAX和JSONP的基本原理,同时,我们也学会了如何使用原生的AJAX和JSONP方法封装请求,并且应用到了实例中,并成功发送了请求并获取到响应结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ajax和jsonp的原生封装(实例) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • js左右弹性滚动对联广告代码分享

    下面是 js 左右弹性滚动对联广告代码分享的攻略: 一、代码实现思路 实现 js 左右弹性滚动对联广告的代码,整体思路如下: 使用 CSS 布局将广告左右对联 使用 JavaScript 监测浏览器窗口大小,以动态设置广告左右对联的位置 实现左右弹性滚动效果,让广告在页面上滑动 下面将分别讲解具体的实现过程。 二、HTML 结构 首先需要在 HTML 文件中…

    JavaScript 2023年6月11日
    00
  • javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历

    一、javascript浏览器判断 要在javascript中进行浏览器判断,可以通过navigator对象获取浏览器的信息。常用的属性包括: navigator.userAgent:获取完整的userAgent字符串; navigator.appName:获取浏览器的名称; navigator.appVersion:获取浏览器的版本号; navigator…

    JavaScript 2023年6月11日
    00
  • Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗

    让我来给你详细讲解一下如何使用Bootstrap编写一个在当前网页弹出可关闭的对话框。以下是具体的步骤: 版本说明 在编写本文时,Bootstrap 的最新版本为 v5.1.0,所以以下过程中的代码也是基于该版本编写的。 准备工作 在使用 Bootstrap 之前,你需要在你的网页中先引入相关的 CSS 和 JavaScript 文件。本文以 CDN 引入为…

    JavaScript 2023年5月19日
    00
  • javascript日期验证之输入日期大于等于当前日期

    针对“javascript日期验证之输入日期大于等于当前日期”这个问题,我们可以采用如下的步骤进行处理: 步骤一:获取用户输入的日期并与当前日期进行比较 我们可以使用Date对象来获取当前日期,然后将用户输入的日期与其进行比较,判断用户输入的日期是否大于等于当前日期。代码如下: // 获取当前日期 var currentDate = new Date(); …

    JavaScript 2023年6月10日
    00
  • JS判断时间段的实现代码

    要实现JS判断时间段的功能,需要以下几个步骤: 获取当前时间:可以使用JavaScript中的Date()对象来获取当前时间。例如:var now = new Date() 得到当前时间在一天中的小时数:可以通过now.getHours()方法获取当前时间的小时数。 根据小时数来判断时间段:一般将一天24小时分为四个时间段,即早上、上午、下午和晚上四个时间段…

    JavaScript 2023年5月27日
    00
  • 解析php防止form重复提交的方法

    下面是解析PHP防止form重复提交的方法的完整攻略: 什么是防止form重复提交? 表单重复提交的情况在Web应用程序中很常见,这可能会导致应用程序的各种问题,例如重复表单提交对数据库的写入,导致数据重复或错误。这是一种不良的用户体验,可能会使用户失去对应用程序的信任感。为了避免这种情况,开发人员已经产生了一些技术来防止表单重复提交,这是Web应用程序设计…

    JavaScript 2023年6月11日
    00
  • element-ui的回调函数Events的用法详解

    下面是element-ui的回调函数Events的用法详解。 什么是Events? Events是element-ui中处理组件事件的一种机制,是一个Vue中的事件对象。和原生的事件对象相比,Events在提供原生事件对象的基础上,提供了一些额外的方法和属性。Events被广泛应用在element-ui组件中,例如Button、Input、Select、Da…

    JavaScript 2023年6月10日
    00
  • JavaScript常用基础知识强化学习

    JavaScript常用基础知识强化学习攻略 1. 前置知识 在进行JavaScript常用基础知识的强化学习之前,需要掌握以下前置知识: HTML和CSS基础知识 程序基本结构(语句、循环、条件判断等) 数据类型、变量、运算符 函数、对象、数组 2. 基础知识强化学习方法 2.1 阅读MDN文档 MDN提供了JavaScript的完整文档,包含了语言核心、…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部