【jQuery】jQuery 处理 Ajax 以及解决跨域问题的方式

文章目录

    • HTTP
    • 原生创建 Ajax
    • jQuery 处理 Ajax
      • $.ajax()
      • $().load()
      • $.get()
      • $.post()
    • 跨域
      • CORS
      • JSONP
      • iframe
      • web sockets

HTTP

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。

在这里插入图片描述

一次 HTTP 操作称为一个事务,其工作过程可分为四步

HTTP协议请求方法

方法说明
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法
HEAD向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回
GET向特定的资源发出请求
POST向指定资源提交数据进行处理请求
PUT向指定资源位置上传其最新内容
DELETE请求服务器删除Request-URI所标识的资源
TRACE回显服务器收到的请求,主要用于测试或诊断
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
PATCH实体中包含一个表,表中说明与该URI所表示的原内容的区别
GETPOST
缓存能被缓存不能缓存
编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码
历史参数保留在浏览器历史中参数不会保存在浏览器历史中
对数据长度的限制当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)无限制
对数据类型的限制只允许 ASCII 字符没有限制,也允许二进制数据
安全性与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
可见性数据在 URL 中对所有人都是可见的数据不会显示在 URL 中

原生创建 Ajax

Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术

原生创建 Ajax 的步骤:1. 创建 Ajax 对象;2. 连接到服务器;3. 发送请求;4. 接收返回值。

// 创建 Ajax 对象
if (window.XMLHttpRequest) {var oAjax = new XMLHttpRequest();// IE7+ Firefox Chrome Opera Safari 浏览器执行代码
} else {var oAjax = new ActiveXObject("Microsoft.XMLHTTP");// IE6 IE5 浏览器执行代码 
}

XMLHttpRequest 是 JavaScript 中用于实现 AJAX(Asynchronous JavaScript and XML)请求的一个核心对象。

open() 方法用于初始化一个到服务器的请求。

send() 方法用于发送已经初始化的请求。

open()

语法:oAjax.open(method, url, async, user, password);

  • method:请求方法,通常是 GETPOST,也可以是 PUT, DELETE 等。
  • url:请求的目标 URL。
  • async:是否异步执行,默认为 true 表示异步,false 表示同步。
  • user:可选参数,用于需要 HTTP 认证的情况,提供用户名。
  • password:可选参数,用于需要 HTTP 认证的情况,提供密码。

send()

语法:oAjax.send(data);

  • data:可选参数,用于发送到服务器的数据。对于 GET 请求,通常不需要传递任何数据;而对于 POSTPUT 等请求,则通常需要传递数据。数据可以是字符串、FormData 对象、Blob 对象或 ArrayBuffer 对象等。
var oAjax = new XMLHttpRequest();
oAjax.open('GET', 'https://api.example.com/data?param=value', true);
oAjax.onload = function () {if (oAjax.status >= 200 && oAjax.status < 300) {console.log(oAjax.responseText); // 成功获取数据} else {console.error('请求失败: ' + oAjax.status);}
};
oAjax.send(); // GET 请求不需要传递数据
var oAjax = new XMLHttpRequest();
oAjax.open('POST', 'https://api.example.com/data', true);
// POST 请求通常需要在发送请求前设置请求头
oAjax.setRequestHeader('Content-Type', 'application/json'); 
oAjax.onload = function () {if (oAjax.status >= 200 && oAjax.status < 300) {console.log(oAjax.responseText); // 成功获取数据} else {console.error('请求失败: ' + oAjax.status);}
};
oAjax.send(JSON.stringify({ key: 'value' })); // 传递 JSON 数据

jQuery 处理 Ajax

请求方法描述适用场景
$.ajax()通用的 AJAX 方法,可以处理各种类型的 HTTP 请求功能最全但也最复杂
$().load()用于将外部 HTML 文件的内容加载到当前页面指定元素的方法使用简单,功能有限
$.get()专门用于处理 GET 请求使用简单,功能有限
$.post()专门用于处理 POST 请求适用于动态加载页面内容

$.ajax()

通过 HTTP 请求加载远程数据

语法:jQuery.ajax([settings])

  • settings:可选。用于配置 Ajax 请求的键值对集合
$("#b01").click(function(){htmlobj = $.ajax({url:"/jquery/test1.txt",async:false});$("#myDiv").html(htmlobj.responseText);
});

参数

参数类型描述
optionsObiect可选,AJAX 请求设置,所有选项都是可选的
asyncBoolean默认值异步请求 true 同步请求为 false
cacheBoolean默认值 true dataType 为 script 和 jsonp 时默认不缓存此页面 false
dataString发送到服务器的数据
dataTypeString预期服务器返回的数据类型
errorFunction请求失败时调用此函数
successFunction请求成功后的回调函数
jsonpString在一个 jsonp 请求中重写回调函数的名字
jsonpCallbackString为 jsonp 请求指定一个回调函数名

常见配置选项

$.ajax({url: '请求的URL',type: '请求类型(如GET、POST等)',data: '要发送的数据(如果是GET请求,通常将数据附加到URL中)',contentType: '发送数据的内容类型(默认为"application/x-www-form-urlencoded; charset=UTF-8")',dataType: '预期服务器返回的数据类型(如html、json、xml、script、text等)',success: function(data, textStatus, jqXHR) {// 请求成功时执行的函数},error: function(jqXHR, textStatus, errorThrown) {// 请求失败时执行的函数},complete: function(jqXHR, textStatus) {// 请求完成后执行的函数,无论成功还是失败},beforeSend: function(jqXHR, settings) {// 在请求发送之前执行的函数},async: true, // 默认情况下为异步请求,设置为false则变为同步请求cache: true, // 默认情况下GET请求会被缓存timeout: 0, // 请求超时时间(毫秒),默认为0(无超时)global: true, // 触发全局AJAX事件processData: true, // 默认情况下会尝试处理发送的数据为查询字符串traditional: false, // 用于序列化数组的参数
});

$().load()

从服务器加载数据,并把返回的数据放入被选元素中

语法:$(selector).load(URL [, data] [, callback]);

  • selector:一个 CSS 选择器字符串,用于匹配 DOM 元素。
  • URL:一个字符串,指定要加载的 HTML 文件的 URL。
  • data:可选参数,一个对象,包含要发送到服务器的数据,这些数据会以 POST 方式发送。
  • callback:可选参数,一个函数,当请求完成时调用(在文档片段被插入到 DOM 中之后)。
【data.html】
<p>Hello from data.html</p>
<div id="content"></div>
<script>$(document).ready(function() {$('#content').load('data.html', function(response, status, xhr) {if (status == 'success') {console.log('加载成功');} else if (status == 'error') {console.error('加载失败: ' + xhr.status + ' ' + xhr.statusText);} else if (status == 'complete') {console.log('加载完成');}});});
</script>

#content 元素将会被填充 data.html 文件的内容。

$.get()

通过 HTTP GET 请求从服务器上请求数据

语法:$.get(url, [data], [callback], [dataType]);

  • url:必需,一个字符串,表示请求的 URL。

  • data:可选,一个对象或字符串,表示要发送到服务器的数据。

  • callback:可选,一个函数,当请求成功时执行。此函数接受三个参数:

    data:服务器返回的数据。

    statusText:HTTP 状态文本,如 “success” 或 “error”。

    jqXHR:jQuery 的 XMLHttpRequest 对象。

  • dataType:可选,预期服务器返回的数据类型,如 “xml”, “html”, “script”, “json”, “text”, “jsonp” 等。

// 带数据的 GET 请求
$.get('https://api.example.com/data', { key: 'value' }, function(data, status) {console.log('请求成功,状态:' + status);console.log('返回的数据:', data);
});
// 错误处理
$.get('https://api.example.com/data', function(data, status, jqXHR) {if (status === 'success') {console.log('请求成功,返回的数据:', data);} else if (status === 'error') {console.error('请求失败,状态码:' + jqXHR.status);}
});

$.post()

通过 HTTP POST 请求从服务器上请求数据

语法:$.post(url, [data], [callback], [dataType]);

参数同上

// 简单的 POST 请求
$.post('https://api.example.com/data', { key: 'value' }, function(data, status) {console.log('请求成功,状态:' + status);console.log('返回的数据:', data);
});
// 指定数据类型
$.post('https://api.example.com/data', { key: 'value' }, function(data) {console.log('请求成功,返回的数据:', data);
}, 'json');
// 错误处理
$.post('https://api.example.com/data', {key:'value'}, function(data,status,jqXHR) {if (status === 'success') {console.log('请求成功,返回的数据:', data);} else if (status === 'error') {console.error('请求失败,状态码:' + jqXHR.status);}
});

除上述基本用法外,$.post() 还可以接受一个配置对象,类似于 $.ajax() 方法的选项

$.post({url: 'https://api.example.com/data',data: { key: 'value' },success: function(data, status, jqXHR) {console.log('请求成功,状态:' + status);console.log('返回的数据:', data);},error: function(jqXHR, textStatus, errorThrown) {console.error('请求失败,状态码:' + jqXHR.status);console.error('错误信息:' + errorThrown);},complete: function(jqXHR, textStatus) {console.log('请求完成,状态:' + textStatus);},dataType: 'json',async: true, // 默认为 true,表示异步请求cache: false, // 默认情况下,POST 请求不会被缓存timeout: 3000 // 请求超时时间(毫秒)
});

跨域

跨域(Cross-Origin)是指从一个域名发起的请求试图访问另一个域名下的资源。浏览器出于安全原因实施了同源策略(Same-Origin Policy),即要求请求的域名、协议和端口必须与当前页面一致。如果不一致,就会产生跨域问题。

例子:在网站中使用ajax请求其他网站的天气、快递或者其他数据接口

在这里插入图片描述

针对跨域问题,有多种解决方案:

CORS

CORS(Cross-Origin Resource Sharing)是一种现代的跨域解决方案,通过在服务器端设置响应头来允许跨域请求。

  • 优点:支持所有 HTTP 请求类型(GET、POST、PUT、DELETE 等)
  • 优点:安全性较高
  • 缺点:ie10以下不支持(可以用XDR实现)

在服务器端,需要设置 Access-Control-Allow-Origin 响应头,允许跨域请求。

// *: 表示所有的域都可以接受
Access-Control-Allow-Origin: *

JSONP

JSONP(JSON with Padding)是一种早期的跨域解决方案,适用于 GET 请求。它的原理是利用 <script> 标签不受同源策略限制的特点,通过动态插入 <script> 标签来请求数据。

  • 实现简单,兼容性好,不受同源策略的限制
  • 只适用于 GET 请求
  • 安全性较低,容易被注入恶意代码
function handleResponse(data) {console.log('响应数据:', data);
}var script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);

iframe

基于 iframe 实现跨域并通过设置 document.domain 的方法,适用于子域名之间需要进行通信的情况。这种方法依赖于将不同子域名的 document.domain 设置为相同的主域名,从而使这些子域名的页面能够在同一个顶级域名下互相访问对方的 DOM。

假设有两个子域名 a.example.comb.example.com,它们都属于 example.com 这个顶级域名。在这种情况下,可以通过设置 document.domain 来实现跨域通信。

【parent.html (放置在 a.example.com 上)】
<script>document.domain = 'example.com'; // 设置document.domain
</script>
<body><h1>Parent Page</h1><iframe id="childIframe" src="http://b.example.com/child.html"></iframe><script>var childIframe = document.getElementById('childIframe');if (childIframe.contentWindow.document.domain === document.domain) {// 现在可以访问子页面的DOMconsole.log(childIframe.contentDocument.body.innerHTML);}</script>
</body>
【child.html (放置在 b.example.com 上)】
<script>document.domain = 'example.com'; // 设置document.domain
</script>
<body><h1>Child Page</h1><p>Hello from Child Page!</p>
</body>

web sockets

WebSockets 是一种用于实现实时双向通信的技术,与传统的 HTTP 请求不同,WebSocket 提供了一个持久的连接,使得客户端和服务器可以持续不断地交换数据。当使用 WebSocket 连接时,浏览器会首先发送一个带有特定头部的 HTTP 升级请求(Upgrade Request)。如果服务器同意升级连接,则会返回带有相应头部的 HTTP 响应,从而建立 WebSocket 连接。

使用 WebSocket 需要服务器端的支持和适当的配置。通过设置 CORS 响应头或使用代理服务器,可以实现客户端与服务器之间的实时双向通信。这种方法适用于需要实时数据交换的应用场景,如聊天应用、实时游戏等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络易混知识点

1.以太网采用曼彻斯特编码&#xff1b;以太网帧最短为64B&#xff0c;其中14个B首部(目的MAC-6B&#xff0c;源MAC-6B&#xff0c;类型-2B)4B尾部 2.OSI协议中&#xff0c;每一层为上一层提供服务&#xff0c;为下一层提供接口 3.帧序号的比特数表示的是发送窗口的大小&#…

LabVIEW提高开发效率技巧----离线调试

离线调试是LabVIEW开发中一项重要的技巧&#xff0c;通过使用Simulate Signal Express VI生成虚拟数据&#xff0c;开发者能够有效减少对实际硬件的依赖&#xff0c;加速开发过程。这种方法不仅可以提高开发效率&#xff0c;还能降低成本&#xff0c;增强系统的灵活性。 ​ 离…

从零开始使用最新版Paddle【PaddleOCR系列】——第二部分:自建数据集 + 模型微调训练

目录 一、自建数据集 1.官方数据集格式参考 2.自建数据集txt文件编写代码 3.数据集检验 二、模型训练 1.模型配置yaml文件 2.命令行指令训练 在上一篇文章中&#xff0c;构建好了paddleOCR 运行必需的环境&#xff0c;并通过在线下载的方式&#xff0c;使用官方训练好的模型进…

OpenCV图像处理——查找线条的转折点

问题描述 图像中有一条线&#xff0c;如何判断这条线的转折点&#xff1f; 比如下面一张图&#xff1a; 目的是找到图中的三个转折点。 要在图像中检测线的转折点&#xff0c;可以通过分析线的几何形状来完成。这通常需要首先提取线的轮廓&#xff0c;然后根据曲率、角度变化…

D42【python 接口自动化学习】- python基础之函数

day42 高阶函数 学习日期&#xff1a;20241019 学习目标&#xff1a;函数&#xfe63;- 55 高阶函数&#xff1a;函数对象与函数调用的用法区别 学习笔记&#xff1a; 函数对象和函数调用 # 函数对象和函数调用 def foo():print(foo display)# 函数对象 a foo print(a) # &…

JavaWeb Servlet--09深入:注册系统05---动态搜索栏

动态搜索栏 分析&#xff1a;在显示用户信息的表单里有一个下拉框选择用户的信息&#xff0c;一个文本框进行输入&#xff0c;一个按钮就行搜索&#xff0c;在下拉框选择了性别或许姓名的某一个包含字就会返回所有满足的用户。在controller层进行接收选择的搜索条件&#xff0…

三菱PLC伺服-停止位置不正确故障排查

停止位置不正确时&#xff0c;请确认以下项目。 1)请确认伺服放大器(驱动单元)的电子齿轮的设定是否正确。 2&#xff09;请确认原点位置是否偏移。 1、设计近点信号(DOG)时&#xff0c;请考虑有足够为0N的时间能充分减速到爬行速度。该指令在DOG的前端开始减速到爬行速度&…

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【Linux】解读信号的本质&相关函数及指令的介绍

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

实时语音转文字(基于NAudio+Whisper+VOSP+Websocket)

今天花了大半天时间研究一个实时语音转文字的程序&#xff0c;目的还包括能够唤醒服务&#xff0c;并把命令提供给第三方。 由于这方面的材料已经很多&#xff0c;我就只把过程中遇到的和解决方案简单说下。源代码开源在AudioWhisper: 实时语音转文字(基于NAudioWhisperVOSPWe…

面试八股(自用)

什么是java序列化&#xff0c;什么时候需要序列化? 序列化是指将java对象转化成字节流的过程&#xff0c;反序列化是指将字节流转化成java对象的过程。 当java对象需要在网络上传输 或者 持久化到存储文件中&#xff0c;就需要对java对象进行序列化处理。 JVM的主要组成部分…

[产品管理-46]:产品组合管理中的项目平衡与管道平衡的区别

目录 一、项目平衡 1.1 概述 1.2 项目的类型 1、根据创新程度和开发方式分类 2、根据产品开发和市场周期分类 3、根据风险程度分类 4、根据市场特征分类 5、根据产品生命周期分类 1.3 产品类型的其他分类 1、按物理形态分类 2、按功能或用途分类 3、按技术或创新程…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…

MusePose模型部署指南

一、模型介绍 MusePose是一个基于扩散和姿势引导的虚拟人视频生成框架。 主要贡献可以概括如下&#xff1a; 发布的模型能够根据给定的姿势序列&#xff0c;生成参考图中人物的舞蹈视频&#xff0c;生成的结果质量超越了同一主题中几乎所有当前开源的模型。发布该 pose alig…

git命令使用一览【自用】

git常见操作&#xff1a; git initgit remote add master【分支名字】 gitgits.xxxxx【仓库中获取的ssh链接或者http协议的链接】检查远程仓库是否链接成功。 git remote -v出现以下画面就可以git pull,git push了

TVS常规过压保护

一、前言 上一篇文章 TVS选型-CSDN博客https://blog.csdn.net/qq_39543984/article/details/142825929?spm=1001.2014.3001.5501我们介绍了如何通过理论计算选择合适的TVS,TVS主要是防止瞬间过压,因为他的名字就叫瞬态二极管(Transient Voltage Suppressor)。本文就通过理…

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务&#xff0c;同时提高餐厅的运营效率。系统后端采用PHP语言开发&#xff0c;利用MySQL数据库进行数据存储与管理&#xff0c;实现了用户注册登录、菜品浏览、购物车管理、订单提…

OpenCV高级图形用户界面(18)手动设置轨迹条(Trackbar)的位置函数setTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数设置指定窗口中指定轨迹条的位置。 注意 [仅 Qt 后端] 如果轨迹条附加到控制面板&#xff0c;则 winname 可以为空。 函数原型 void cv…

jmeter用csv data set config做参数化1

在jmeter中&#xff0c;csv data set config的作用非常强大&#xff0c;用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下&#xff1a; Variable Names处&#xff0c;写上源文件中的参数名&#xff0c;用于后续接口发送请求时引用 Ignore first line…

Java项目-基于Springboot的农机电招平台项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…