原生js的ajax和解决跨域的jsonp(实例讲解)

关于原生JS的AJAX和JSONP的介绍和实例讲解,我将从以下三个部分来进行详细解答。

  1. AJAX的介绍和使用方法

AJAX全称为Asynchronous JavaScript and XML(异步的JavaScript和XML),是一种前端常用数据交换技术,能够实现页面异步刷新,避免了页面重新刷新的效果,减轻服务器对请求的压力。使用AJAX技术可以更好的优化用户体验。

AJAX的核心思路是XMLHttpRequest对象及其API,XMLHttpRequest可以在后台与服务器进行数据交换,无需刷新整个页面。在JS中,通过创建XMLHttpRequest对象来发送HTTP请求和接收HTTP响应。基本使用方法如下:

let xhr = new XMLHttpRequest(); //创建XMLHttpRequest对象
xhr.open("GET/POST", url, async); //初始化请求
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //设置请求头
xhr.onreadystatechange = function() { //回调函数
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
    }
};
xhr.send(data); //发送请求

其中,open()方法用于初始化请求,第一个参数是请求的方法,一般是GET和POST,第二个参数为请求的URL,第三个参数表示是否为异步请求。

setRequestHeader()方法用于设置请求头内容,例如Content-Type等HTTP信息。

onreadystatechange是回调函数,当readyState属性发生变化时,该函数被触发。当readyState为4,而status为200时,表示响应已经就绪,数据也已经成功响应。

send()方法用于向服务器发送请求,参数为要发送的数据。

  1. JSONP的介绍和使用方法

JSONP全称是JSON with Padding(含跨域回调的JSON),是解决跨域问题的一种方案,常用于前端与不能CORS的服务器进行数据交换。

JSONP的本质是通过<script>标签的跨域特性实现的。由于<script>标签不受同源策略影响,因此在前端页面中可以动态生成<script>标签,并通过它将一段JS代码插入到当前页面中执行。

JSONP的实现过程中,于服务器端约定一个回调函数,前端通过设置该函数的名称权当做参数传给服务器,服务器在接收到请求后会将JSON数据作为传递给该函数并作为字符串返回给前端。前端页面接收到该字符串后,自动将其当做JS脚本执行,从而达到了跨域获取数据的目的。

JSONP的基本使用方法如下:

function jsonp(url, cb) {
    let script = document.createElement('script');
    script.src = url + '&callback=' + cb;
    document.head.appendChild(script);
}

jsonp('https://www.example.com/data', 'handleData');

function handleData(data) {
    console.log(data);
}

上述代码中,jsonp()函数用于生成请求地址和动态插入<script>标签,接收两个参数:跨域请求URL和回调函数名称。请求URL中将callback参数设置为我们约定的回调函数名称,由于请求的数据不在JS脚本之中,请求时只能使用GET请求。

  1. 实例讲解

(1)AJAX示例

当用户在页面上输入关键字搜索时,我们要用AJAX向后端请求相关数据,通过搜索的结果,更新当前页面的内容。示例代码如下:

HTML:

<input type="text" id="search">
<button id="btn">搜索</button>
<div id="result"></div>

JS:

const search = document.querySelector('#search');
const btn = document.querySelector('#btn');
const result = document.querySelector('#result');
let xhr = null;
btn.addEventListener('click', function() {
    let keyWords = search.value.trim();
    if (keyWords === '') {
        return alert('请输入查询关键字!');
    }
    if (xhr !== null) {
        xhr.abort(); //中断上次的请求
    }
    xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            result.innerHTML = xhr.responseText;
        }
    };
    xhr.open('GET', 'http://www.example.com/search?keyWords=' + encodeURIComponent(keyWords), true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(null);
});

这个示例通过监听click事件实现关键字搜索,点击按钮时通过AJAX向服务器请求数据,并更新页面内容。

(2)JSONP示例

假设我们要跨域获取github用户信息,我们可以利用github提供的API接口实现,该API允许我们通过callback参数设置回调函数,并返回JSONP格式的数据,示例代码如下:

JS:

function jsonp(url, cb) {
    let script = document.createElement('script');
    script.src = url + '&callback=' + cb;
    document.head.appendChild(script);
}
let user = document.querySelector('#user');
let btn = document.querySelector('#btn');

btn.addEventListener('click', function() {
    let username = user.value.trim();
    if (username === '') {
        return alert('请输入Github用户名!');
    }
    jsonp(`https://api.github.com/users/${username}`, 'handleData');
});

function handleData(data) {
    console.log(data);
    alert(`用户名: ${data.login}\n姓名: ${data.name}\nBlog: ${data.blog}\nFollowers: ${data.followers}`);
}

这个示例通过监听click事件实现了跨域获取github用户信息,通过设置URL和回调函数名称实现AJAX获取数据。获取到数据后通过处理函数处理返回的结果,并弹窗显示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js的ajax和解决跨域的jsonp(实例讲解) - Python技术站

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

相关文章

  • Javascript Global isFinite() 函数

    以下是关于JavaScript Global对象中isFinite()函数的完整攻略,包括两个示例说明。 JavaScript Global对象中的isFinite()函数 JavaScript Global对象中的isFinite()函数用于判断一个数值是否为有限数值。如果一个值是有限数值,则返回true,否则返回false。isFinite()函数可以用…

    JavaScript 2023年5月11日
    00
  • JS实现的进制转换,浮点数相加,数字判断操作示例

    JS实现的进制转换攻略: 对于进制转换,JS提供了parseInt和toString方法。其中parseInt方法可将其他进制的数字转换为十进制,toString方法可将十进制数字转换为其他进制。 示例说明1:将十六进制数字转换为十进制 let hex = "3A"; let dec = parseInt(hex, 16); consol…

    JavaScript 2023年5月28日
    00
  • javascript实现限制上传文件大小

    下面是实现限制上传文件大小的完整攻略。 步骤一:JS获取文件大小 首先,我们需要通过 JavaScript 获取上传的文件大小。可以通过以下代码来实现: // 选取上传文件的 input 元素 const fileInput = document.querySelector(‘input[type="file"]’); // 为 inpu…

    JavaScript 2023年6月11日
    00
  • JavaScript满天星导航栏实现方法

    下面是JavaScript满天星导航栏实现方法的完整攻略。 1. 实现思路 满天星导航栏可以用CSS3的transform属性实现。具体来说,可以让导航栏容器旋转一定的角度,并让每个导航链接沿着一个圆形路径排列,从而实现满天星的效果。接下来,我们就按照以下步骤来完成实现: 创建HTML结构,包含导航栏的容器及各个导航链接。 使用CSS样式设置导航栏容器的初试…

    JavaScript 2023年6月10日
    00
  • form表单转Json提交的方法(推荐)

    当我们使用form表单作为数据提交的方式时,常常需要将表单数据转换为Json格式进行提交。下面是基于jQuery的form表单转Json提交的方法。 利用serialize()方法序列化form表单 在jQuery中,可以使用serialize()方法将一个表单元素的值转化为查询字符串格式。而JavaScript提供了eval()方法,可以将字符串转换为JS…

    JavaScript 2023年5月27日
    00
  • js数组的五种迭代方法及两种归并方法(推荐)

    下面是关于“js数组的五种迭代方法及两种归并方法”的详细讲解: 1. 前言 在JavaScript中,数组是一种非常常见的数据类型。对于数组的操作,我们既可以使用循环遍历,也可以使用数组提供的方法进行处理。本文主要介绍 js 数组的五种迭代方法及两种归并方法。这些方法要熟练掌握,能够帮助我们高效地处理数组。 2. 迭代方法 2.1 forEach forEa…

    JavaScript 2023年5月27日
    00
  • 详解VueRouter 路由

    详解 VueRouter 路由 VueRouter 是 Vue.js 的官方路由管理器,它可以将不同的 URL 地址映射到不同的组件,并且在组件之间进行快速切换和传递数据。在本文中,我们将详细讲解 VueRouter 的使用方法,包括安装、基本用法、动态路由、嵌套路由等内容。 安装 安装 VueRouter 非常简单,只需要在终端中运行以下命令: npm i…

    JavaScript 2023年6月11日
    00
  • HTA版JSMin(省略修饰语若干)基于javascript语言编写

    HTA版JSMin 基于javascript语言编写的完整攻略 什么是HTA版JSMin HTA版JSMin是一个基于javascript语言编写的代码压缩工具,可以将javascript代码文件进行压缩和精简,从而减少代码文件的大小,加速加载速度。 如何使用HTA版JSMin 下载HTA版JSMin的压缩包并解压缩:https://github.com/d…

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