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

yizhihongxing

关于原生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日

相关文章

  • $.ajax中contentType: “application/json” 的用法详解

    下面是“$.ajax中contentType: application/json 的用法详解”的完整攻略。 什么是contentType contentType是Ajax请求中的一个参数,表示请求的数据类型。通过这个参数,我们可以告诉服务器我们请求的数据的格式是什么。常用的contentType有application/x-www-form-urlencod…

    JavaScript 2023年6月11日
    00
  • 理解JavaScript中worker事件api

    理解JavaScript中worker事件API,需要掌握以下几个关键点: 什么是Worker线程? Worker线程是JavaScript中的一种特殊线程,它可以在后台运行独立的JavaScript代码片段,可以与主线程并行工作,从而提高整个Web应用程序的性能。 什么是Worker事件API? Worker事件API是用于管理Worker线程和主线程之间…

    JavaScript 2023年5月28日
    00
  • 浅谈JavaScript数据类型及转换

    浅谈JavaScript数据类型及转换 JavaScript是动态类型语言,它不需要提前声明变量数据的类型。这意味着变量的数据类型是在运行时才确定的。在JavaScript中,常见的数据类型包括: 原始类型:字符串(String)、数字(Number)、布尔值(Boolean)、空值(Null)、未定义(Undefined)和Symbol(ES6新增)。 引…

    JavaScript 2023年5月18日
    00
  • JavaScript Tips 使用DocumentFragment加快DOM渲染速度

    使用DocumentFragment可以有效地加快DOM渲染速度,特别是在需要大量的DOM操作时,使用DocumentFragment是非常有用的。下面是详细的攻略。 什么是 DocumentFragment 在DOM中,DocumentFragment是一种轻量级的文档容器,用于组合一些DOM元素,然后将它们添加到文档树中。它是DOM树的一部分,但不是真正…

    JavaScript 2023年6月10日
    00
  • 原生js实现淘宝首页点击按钮缓慢回到顶部效果

    实现淘宝首页点击按钮缓慢回到顶部效果可以采用原生Javascript,下面是具体的实现步骤: 1. 获取回到顶部按钮以及页面滚动条 首先,在页面中添加“回到顶部”按钮,然后使用JS代码获取该按钮以及页面滚动条的对象: var scrollBtn = document.getElementById(‘scrollBtn’); var scrollTop = d…

    JavaScript 2023年6月10日
    00
  • 通过循环优化 JavaScript 程序

    通过循环优化 JavaScript 程序是我们在开发过程中常用的一种优化手段,这种手段主要通过循环和处理数据来实现程序的优化。下面我们将为大家提供一份完整的攻略,让大家更好的了解如何通过循环优化 JavaScript 程序。 步骤 1:确定程序瓶颈 在进行循环优化之前,我们首先需要确定程序瓶颈,这样才能有的放矢的进行优化。通过使用 Chrome 开发者工具中…

    JavaScript 2023年5月27日
    00
  • 教你javascript如何获取对象的key和value

    当需要遍历一个JavaScript对象时,我们可能需要获取其key和value。下面是获取JavaScript对象key和value的两种方式: 获取对象key的方法 我们可以使用 for…in 循环语句来获取JavaScript对象的所有key: for(let key in obj) { console.log(key); // 输出该对象的所有ke…

    JavaScript 2023年5月27日
    00
  • js脚本分页代码分享(7种样式)

    我来为你详细讲解“JS脚本分页代码分享(7种样式)”的攻略。 攻略分析 该攻略主要介绍如何使用JavaScript实现分页功能,并提供了7种不同的样式供选择。具体实现过程分为两部分:前端页面展示和后端数据获取。 前端页面展示:主要是在页面上展示分页的样式和相关的操作功能,通过JavaScript监听用户的操作完成前端展示的相关效果。 后端数据获取:通过Aja…

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