javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】

下面是关于“javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】”的完整攻略:

AJAX简介

AJAX(Asynchronous JavaScript and XML)指的是利用JavaScript在不刷新整个页面的情况下向服务器发送请求和获取响应数据,在前端页面进行异步数据交互的技术。

AJAX 的优点有:用户体验好,可以实现页面的局部刷新,减少不必要的服务器请求。

XMLHttpRequest对象

在JavaScript中可以通过XMLHttpRequest对象来实现对服务器资源的请求。

XMLHttpRequest对象的主要方法和属性:

属性

  • readyState:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化,1: 服务器连接已建立,2: 请求已接收,3: 请求处理中,4: 请求已完成,且响应已就绪。
  • status:HTTP状态码。200表示请求成功;400表示请求出现了问题;500表示服务器错误。
  • responseText:响应返回的文本。
  • responseXML:响应的 XML 文档。

方法

  • open(method,url,async): method: 请求的类型;url: 请求的 URL;async: true(异步)或 false(同步)。
  • send(string): 将请求发送到服务器。string 仅用于 POST 请求。

jQuery 中的AJAX

在jQuery中,使用 $.ajax方法来实现AJAX请求。

$.ajax()的方法构造如下:

    $.ajax({
        url: '请求地址',
        type: 'GET/POST',
        data: '发送数据',
        dataType: '返回数据的格式(text/xml/json等)',
        success: function(data){
            //响应成功后的回调函数
        },
        error: function(xhr, status, error){
            //失败时的回调函数
        }
    });

下面是一个利用jQuery实现AJAX请求的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AJAX request with jQuery</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <h1>Welcome to AJAX with jQuery</h1>
    <button id="btn-click">Click for AJAX</button>

    <script>
        $(document).ready(function(){
            $("#btn-click").click(function(){
                $.ajax({
                    url: "https://api.coindesk.com/v1/bpi/currentprice.json",
                    dataType: "json",
                    success: function(data){
                        console.log(data);
                        alert("Current Bitcoin price: " + data.bpi.USD.rate + " USD");
                    }
                });
            });
        });
    </script>
</body>
</html>

在这个例子中,我们使用了$.ajax来请求 CoinDesk API获取了最新的比特币价格。在成功回调函数中,我们将当前比特币价格打印到控制台,并用一个弹窗来显示当前的美元价格。

AJAX跨域问题

XHR限制了AJAX只能在相同的域名下进行请求,如果要请求一个不同域名下的资源需要解决跨域问题。常见的解决跨域问题的方案如下:

JSONP

JSONP 是最常用的跨域技术,利用script标签完成跨域。常规情况下,script标签引用的是静态资源,如jquery.js等,但也可以引用包含一个callback参数的url来请求动态数据。服务器解析后将数据以函数参数形式返回,从而实现跨域。

下面是一个 JSONP 的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AJAX request with JSONP</title>
</head>
<body>
    <h1>Welcome to AJAX with JSONP</h1>
    <button id="btn-click">Click for JSONP</button>

    <script>
        function jsonpCallback(data){
            console.log(data);
            alert("Current Bitcoin price: " + data.bpi.USD.rate + " USD");
        }

        function loadJSONP(){
            let script = document.createElement('script');
            script.type = "text/javascript";
            script.src = "https://api.coindesk.com/v1/bpi/currentprice.json?callback=jsonpCallback";
            document.getElementsByTagName('head')[0].appendChild(script);
        }

        document.getElementById("btn-click").addEventListener("click", function(){
            loadJSONP();
        });
    </script>
</body>
</html>

在上面的例子中,我们改变了jQuery例子中的$.ajax方法,并使用了一个特殊的URL,其中包含一个“callback”参数,指向一个在JavaScript文件内的全局函数。服务器端需要解析这个参数,并将数据返回给这个全局函数的参数中。

CORS

对于IE10及以上版本,Chrome、Firefox和Safari等浏览器都支持CORS(Cross-Origin Resource Sharing)技术。CORS是一种官方的跨域请求解决方案,需要在服务器中配置相关的响应头信息。

    response.setHeader("Access-Control-Allow-Origin", "http://localhost:8081");
    response.setHeader("Access-Control-Allow-Methods", "GET,POST");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");

其中,"Access-Control-Allow-Origin"允许访问该资源的制定域名;"Access-Control-Allow-Methods"允许访问该资源的请求方法;"Access-Control-Allow-Headers"允许访问该资源的请求头信息。

在前端使用AJAX时,需要将xhr.withCredentials属性设为true,这样才能在请求中发送Cookies等用户认证凭据等信息。

下面是一个使用CORS实现AJAX跨域的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AJAX with CORS</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <h1>Welcome to CORS AJAX Request</h1>
    <button id="btn-click">Click for Cookies</button>

    <script>
        $(document).ready(function(){
            $("#btn-click").click(function(){
                $.ajax({
                    url: "http://localhost:8080",
                    type: "GET",
                    xhrFields: { withCredentials: true },
                    crossDomain: true,
                    success: function(data){
                        console.log(data);
                        alert("Server said: " + data.msg);
                    }
                });
            });
        });
    </script>
</body>
</html>

在这个例子中,我们通过将xhr.withCredentials属性设为true告诉浏览器,我们打算接收来自其他域的Cookies,并且通过crossDomain属性告诉jQuery这是一个跨域请求。服务器端设置了跨域策略允许了该资源的访问,其中"Access-Control-Allow-Origin"允许所有域名访问该资源,"Access-Control-Allow-Credentials"允许跨域请求携带cookie。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs批量修改文件编码格式

    下面详细讲解一下“nodejs批量修改文件编码格式”的完整攻略。 1. 背景介绍 在生产建设中,可能会有多个不同编码格式的文件。如果需要将他们全部改为同一种编码格式,可以使用Node.js批量修改这些文件的编码格式。 2. 环境准备 在开始之前,需要安装 Node.js 的最新版本,并安装 iconv-lite和 fs 模块。要安装,可以执行以下命令: np…

    node js 2023年6月8日
    00
  • nodejs 如何手动实现服务器

    首先,我们需要了解一些基础知识,包括Node.js和HTTP协议的基本原理。 Node.js是一个使用JavaScript构建应用程序的平台。它使用事件驱动、非阻塞I/O模型,可以快速、高效地处理大量的并发连接。HTTP是一种基于请求和响应模式的协议,用于从web服务器传输超文本。 为了手动实现一个服务器,我们需要完成以下步骤: 引入http模块 我们使用N…

    node js 2023年6月8日
    00
  • Nodejs探秘之深入理解单线程实现高并发原理

    这是一个非常有趣的话题。在讲解Node.js单线程实现高并发原理之前,我们需要先明确几个概念。 什么是线程?线程是程序执行流的最小单元,也被称为轻量级进程 (LWP)。单个进程可以拥有多个线程,这些线程可以同时执行,但是它们共享与进程相关的系统资源 (如内存)。 什么是并发?并发是指在一段时间内,有多个任务在执行,而这些任务可能会同时执行或交替执行。 什么是…

    node js 2023年6月8日
    00
  • dtree 网页树状菜单及传递对象集合到js内,动态生成节点

    下面我将为您详细介绍如何实现 “dtree 网页树状菜单及传递对象集合到js内,动态生成节点” 的攻略。 准备工作 为了实现这个功能,我们需要准备以下工作:- 安装 dtree 插件- 准备要展示的数据(例如:从后端获取到的树状结构数据) 使用 dtree 插件实现树状菜单 在 HTML 页面中引入 dtree 文件 <script src=&quot…

    node js 2023年6月8日
    00
  • express框架下使用session的方法

    下面是关于express框架下使用session的方法的完整攻略。 Step 1:安装express-session模块 首先要在项目中安装一个express-session模块,以便在express框架下使用session。可以通过npm命令来安装: npm install express-session –save 其中–save参数是指将该模块安装…

    node js 2023年6月8日
    00
  • require.js中的define函数详解

    当你使用require.js进行模块化开发时,你需要使用define函数来定义对应的模块。本文将对define函数的详细用法进行介绍。 1. define函数的基本语法 define(id?, dependencies?, factory); define函数接收三个参数: id : 一个可选参数,表示模块的ID,如果不提供该参数,define函数会根据当前…

    node js 2023年6月8日
    00
  • js复制文本到粘贴板(Clipboard.writeText())

    JS复制文本到粘贴板 (Clipboard.writeText()) 复制文本到粘贴板是一个常见的需求,比如网站上提供一个按钮,点击后可以将某个文本复制到用户的粘贴板中,以便用户可以直接粘贴到其他的应用程序中。在 JavaScript 中,使用 Clipboard 的 API 可以轻松地实现这个功能。下面是完整的攻略。 步骤 1: 获取元素 首先,我们需要从…

    node js 2023年6月8日
    00
  • 新入门node.js必须要知道的概念(必看篇)

    下面来详细讲解“新入门node.js必须要知道的概念(必看篇)”的攻略。 标题 1. Node.js是什么 Node.js是由Ryan Dahl于2009年开发,基于Chrome V8引擎的JavaScript运行环境,使得JavaScript可以脱离浏览器运行在服务器端,提高了服务器JavaScript的开发效率,同时具备异步、事件驱动等特点,适合编写高并…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部