iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >AJAX的简介以及跨域通信的实现
  • 940
分享到

AJAX的简介以及跨域通信的实现

2024-04-02 19:04:59 940人浏览 泡泡鱼
摘要

本篇内容主要讲解“ajax的简介以及跨域通信的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“AJAX的简介以及跨域通信的实现”吧!1.Ajax1.1.Aja

本篇内容主要讲解“ajax的简介以及跨域通信的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“AJAX的简介以及跨域通信的实现”吧!

1.Ajax

1.1.Ajax简介
  Ajax简介这一部分我们主要是谈一下ajax的起源,ajax是什么?因为这些是跟技术无关的。所以,大多细节都是一笔带过。

  Ajax的起源?

  Ajax一词源于2005年 Jesse James Garrett发表的一篇题为"Ajax:A new Approach to WEB Applications".他在这篇文章中介绍了一种新技术,用他的话说,就是Ajax :Asynchronous javascript +XML的缩写。

  Ajax是什么?

  这种新技术的主要目的就是为了使前端网页能够向服务器请求额外的数据而不需要卸载页面。自从这种技术出现以后,微软率先引入XHRt对象(ajax能够实现的核心对象),然后其他浏览器相继实现这种技术。总而言之,ajax就是一种能异步通信的技术。

1.2.Ajax的核心对象---XMLHttpRequest
  因为IE5是最先引入这个XHR对象的,当时并没有事实上的标准。在IE中有三种不同的XHR对象版本:MSXML2.XMLHttp,MSXML2.XMLHttp.3.0和MSXML2.XMLHttp.6.0;

根据这三种版本号,在IE中创建一个XHR对象如下:

function createXHR() { //IE7之前的版本通过这种方式
  var versions = [
    'MSXML2.XMLHttp',
    'MSXML2.XMLHttp.3.0',
    'MSXML2.XMLHttp.6.0'
  ];
  var xhr = null;
  for (var item in versions) {
    try {
      xhr = new ActiveXObject(item); //若不存在该版本,可能会出错
      if (xhr) break;
    } catch (e) {
      //一般对这种错误不做处理
    }
  }
  return xhr;
}
在IE引入这个对象之后,其他浏览器厂商也相继跟随,这时候XHR对象成为事实上的标准!

跨浏览器创建XHR对象;

function createXHttpRequest() {
  if (typeof XMLHttpRequest !== 'undefined') { //不要用 if(XMLHttpRequest){}这种形式,
    return new XMLHttpRequest();              //如果是这种形式在找不到XMLHttpRequest函数的情况下,会报错。
} else if (typeof ActiveXObject !== 'undefined') {
         return createXHR(); //用到刚才我们创建的函数
  } else { throw new Error('不能创建XMLHttpRequest对象'); } }

1.2.XMLHttpRequest的用法
XMLHttpRequest对象的函数有6个:

open("method",url,boolean);
              //该方法的三个参数,分别为----提交方式"get"或者"post"等 
                //&& url是相对于执行代码的当前页面的路径(使用绝对路径是允许的)&&是否异步 
send();    
           //这个方法接收一个参数,这个参数是作为请求主体发送的数据, 
           //说明: 如果有参数,请使用post方式提交 使用方式如下,send("user="+username+"&pwd="+passWord);
           //如果没有参数,为了兼容性考虑,必须在参数中传入null,即send(null);该方式使用get方式提交

abort();       //取消当前响应,关闭连接并且结束任何未决的网络活动。

          //这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决             //的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。

getResponseHeader()   

          //返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任             //何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。

          //该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyStat             //e 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并             //返回,使用逗号和空格分隔开各个头部的值。

getAllResponseHeaders()       

          //把 HTTP 响应头部作为未解析的字符串返回。

          //如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的

          //头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "\r\n" 隔开。

setRequestHeader()

         //向一个打开但未发送的请求设置或添加一个 HTTP 请求。

  XMLHttpRequest对象的属性有5个:

属性 描述
responseText 作为响应主题被返回的文本
responseXML 如果相响应的是text/html或者application/xml类型的话,这个属性将保存着响应的XML文档
status http的响应状态码
statusText http状态的说明
readyState XMLHttpRequest对象的状态位 0 1 2 3 4 分别表示5种状态
timeout 设置超时时间,单位是ms.目前只有IE8+支持---尚未标准化(不推荐使用)

  XMLHttpRequest对象的事件属性onReadyStateChange:-----所有浏览器兼容

  该属性监听的是  XMLHttpRequest对象的readyState属性的变化:

  readyState的变化分别对应如下状态:

  0:尚未初始化。未调用open()之前

  1:启动。调用open()之后,但是未调用send();

  2:发送。调用send()但是尚未得到响应。

  3:正在接收数据。刚接收到响应数据开始到接收完成之前。

  4: 完成。数据接收完成。

xhr.onreadystatechange = function () {
 if (xhr.readyState == 4) {
  if (xhr.status >= 200 && xhr.status <== 300 || xhr.status == 304) {
   alert(xhr.responseText);
   //处理接收的数据
  } else {
   //请求失败,未得到响应数据
  }
 }
}; //补充说明:注册事件必须发生在send()以前

XMLHttpRequest对象的事件属性ontimeout -----仅限IE8+,不过最新的主流高版本浏览器也已经实现(不推荐使用)

xhr.timeout=1000;//一秒钟

xhr.ontimeout=functon(){
  //处理代码
  ......
}
  这种使用方式有个问题需要注意,就是在超时之后,在接收到数据后仍然会触发onreadystatechange事件,如果在处理onreadychange事件时访问xhr.status属性,会出错。所以我们在访问该属性时需要做一下try{}catch处理。但是,因为这个属性暂不兼容,所有我们就不重点讲了。

XMLHttpRequest对象的事件属性onload onerror onloadstar onbort onprogress:

                                                                                                   -----非IE浏览器和IE 10+已实现

       onload在IE8以上可以实现,大部分事件根据readySate变化均可以实现,以上事件只不过是方便使用而已。

  onload和onprogress 这两种事件分别对应着readyState=4和readyState=3的情况,使用方式分别如下:

   xhr.onload= function (event) {
      //event只包含一个属性 event.target=xhr;使用方式只是在readyState=4时差不多..
    }
   xhr.onprogress=function(event){
     //event除了包含event.target=xhr之外,还包含三种属性
     //lengthComputale(进度信息是否可用),position(已接受字节数)和totalSize(总字节数).
     
   }


补充:有些事件均可以根据readyState的状态进行模拟。只有有的浏览器进行了方便化处理而已。  

3.单向跨域技术 ---CORS
 今天我们这里讲的是客户端网页向不在同一个域的服务器请求数据..客户端在收到返回的数据时时,用回调函数处理数据。

即:

 1. 客户端向域外服务器请求数据

 2.服务器得到响应后向客户端发送数据。

 3.客户端根据返回的数据执行回调函数.

 我知道不同域下的iframe也可以进行通信,而且这也是一种跨域通信技术。但是,这种iframe页面之间的双向通信,我们在下一个专题里面讲解,今天主要讲的是单向通信。

3.1.CORS跨域请求的原理
在用xhr(XMLHttpRequest)对象或者xdr(XDomainRequest)对象,发送域外请求时,大概的实现原理如下图:

 3.2.IE中CORS技术的实现
 IE8引入了一个XDR类型,这个类型与XHR基本类似,但是其能实现安全可靠地跨域通信。

 XHD的特点:

 1.cookie不会随请求发送,也不会随响应返回。

 2.只能设置请求头部中的Content-Type片段。

 3.不能访问响应头部信息。

 4.只是支持get和post请求。

 XDR支持onload和onerror事件属性,且其使用方式和XHR基本一致,不过其open()只接收两个参数,默认是异步的。

var xdr = new XDomainRequest();
xdr.onload = function () {
 //处理xdr.responseText
}
xdr.onerror = function () {
};
xdr.open('get', '绝对url');
xhr.send(null);

3.3.跨浏览器的CORS技术实现

在标准浏览器中XHR对象就已经可以自动实现跨域请求,但是XHR和XDR的不同之处:

1.XHR可以在设置 withCredentials =true时,浏览器会把cookie发送给服务器,服务器此时通过设置头部Access-Control-Allow-Credentials:true时来响应。如果,服务器不设置这个属性,则浏览器会触发onerror事件。

2.在回调函数中可以访问status和statusText属性,而且支持同步请求。

 以下是实现跨域请求的代码:

function createCrosRequest(method, url) {
 var xhr = new XMLHttpRequest(); //IE7+
 if ('withCredentials' in xhr) { //IE8-IE9浏览器没有这个属性
  xhr.open(method, url, true);
 } else if (typeof XDomainRequest != 'undefined') {
  xhr = new XDomainRequest();  //IE
  xhr.open(method, url)
 }
 return xhr;
}
var request=CreateCrosRequest("get","url");
if(request){
 request.onload=function(){
 //处理request.responseText;
 }
 request.send(null);
}

4.单向跨域技术 ---JSONP技术

 JSONP技术比较简单,其主要原理主要是利用script标签的特性。

 script标签和image标签一样,它们都具有src属性,而且这个属性是可跨域的。

因为script标签返回的都是js代码,且该js代码会自动执行。所以,如果我们请求返回的数据也是类似一段js代码的形式,岂不是就可以实现在脚本加载完毕后自动执行。

如果我们的请求,返回的数据是 callback + '(' + json + ')'; 这种形式的数据, 那么在脚本加载完毕之后也就能自动执行callback()函数了.

4.1.客户端写法

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
    <button id="button">请求数据</button>
</body>
<script>
  window.onload=function(){
    var button=document.getElementById("ibutton");
    function callback(data){
      //处理data
    }
    button.onclick=function(){
      var script=document.createElement("script");
      script="http://www.sasd.com/json/?callbak=callback"; 
      document.body.insertBefore(script,document.body.firstChild);//加载脚本
      
    }
    
  }
</script>
</html>

   1.客户端将回调函数名写入<Script>脚本的url参数中。

   2.script加载的时候会发送跨域请求。

4.2.服务器端

 1.通过url得到函数名,命名为callback

 2.将请求的数据作为函数的参数格式转化json格式,命名为。

 3.将返回结果拼接为 callback+"("+json+")"; --------返回的就是填充式的数据,这段数据在脚本中会自动执行。

 4.返回数据.

 4.3.JSONP技术的缺点

 1.因为是通过url传参数,所以请求只能是get类型的。

 2.<script>目前只有onload属性事件,onerror还没有统一化,如果加载脚本出错,客户端很难得到反馈。

 3.所请求数据的站点必须是可信任的,如果返回的数据段中注入的有恶意的代码,危害较大,且难以发现。

到此,相信大家对“AJAX的简介以及跨域通信的实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: AJAX的简介以及跨域通信的实现

本文链接: https://www.lsjlt.com/news/78823.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • AJAX的简介以及跨域通信的实现
    本篇内容主要讲解“AJAX的简介以及跨域通信的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“AJAX的简介以及跨域通信的实现”吧!1.Ajax1.1.Aja...
    99+
    2024-04-02
  • 如何利用iframe实现ajax跨域通信
    本篇内容介绍了“如何利用iframe实现ajax跨域通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在漫...
    99+
    2024-04-02
  • vue中iframe使用以及结合postMessage实现跨域通信
    目录使用场景需求iframe使用基本使用常用属性iframe高度自适应获取iframe的内容同域下获取父级/子级内容iframe跨域postMessage通信在vue中使用使用场景 ...
    99+
    2024-04-02
  • PHP Session 跨域与AJAX的异步通信优化
    随着互联网的发展,跨域访问和异步通信已成为现代web应用开发中的常见需求。本文将重点介绍如何使用PHP Session实现跨域访问,并提供一些优化的方法来改善AJAX的异步通信效率。一、跨域访问的问题在Web开发中,当浏览器从一个域名的网页...
    99+
    2023-10-21
    PHP session ajax
  • 解密 JavaScript 跨域问题:轻松实现跨域通信
    跨域问题成因 跨域问题是指浏览器出于安全考虑,限制了不同域之间的脚本访问。当一个脚本试图访问另一个域上的资源时,就会触发跨域问题。跨域问题通常表现为以下几种情况: AJAX 请求被阻止 WebSocket 连接无法建立 脚本无法访...
    99+
    2024-02-23
    跨域 CORS JSONP WebSocket postMessage
  • JavaScript+JSONP:实现跨域数据通信的妙招
    跨域数据通信是一个常见的问题,尤其是在现代Web应用中,数据通常需要在不同的域之间进行交换。然而,由于浏览器同源策略的限制,跨域数据通信受到了一定的限制。即JavaScript脚本只能访问与加载脚本的页面来自同一个域的资源,这使得跨域数...
    99+
    2024-02-24
    JSONP 跨域 数据通信
  • 基于iframe如何实现ajax跨域请求以及获取网页中ajax数据
    这篇文章给大家分享的是有关基于iframe如何实现ajax跨域请求以及获取网页中ajax数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。大家都知道,在不同域的情况下是不能发送a...
    99+
    2024-04-02
  • 如何实现AJAX简单异步通信
    这篇文章主要讲解了“如何实现AJAX简单异步通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现AJAX简单异步通信”吧!具体分析如下:客户端:向服务...
    99+
    2024-04-02
  • AJAX实现跨域的方法有哪些
    这篇文章将为大家详细讲解有关AJAX实现跨域的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。域: 域是WIN2K网络系统的安全性边界。我们知道一个计算机网最基本的单元就是“域”,这一点不是WIN...
    99+
    2023-06-08
  • Vue中iframe结合window.postMessage实现跨域通信
    目录一、前言二、应用场景2.1 嵌入页面2.2 postMessage 实现父子页面通信2.3 子页面向父页面传值2.4父页面代码:一、前言 什么是iframe? iframe 元素...
    99+
    2022-12-31
    vue iframe 跨域通信 window.postMessage 跨域通信 vue跨域通信
  • Vue使用postMessage实现父子跨域通信
    目录一、跨域通信二、示例三、拓展阅读vue项目中postMessage的使用总结postMessage简介项目搭建一、跨域通信 1.子向父通信parent.html // 页面销毁前...
    99+
    2022-12-31
    Vue父子跨域通信 Vue postMessage Vue跨域通信 postMessage使用
  • 使用postMessage实现iframe跨域通信的示例代码
    1、父页面内容 <!DOCTYPE html> <html> <head> <meta charset="utf-8...
    99+
    2024-04-02
  • AJAX请求数据及实现跨域的三种方法详解
    目录传统方法的缺点:什么是ajax?XMLHttpRequest 对象五步使用法:同步和异步的区别:如何将原生ajax进行封装JS几种跨域方法和原理附:ajax跨域post请求的ja...
    99+
    2024-04-02
  • vue内嵌iframe跨域通信的实例代码
    目录vue内嵌iframe跨域通信1、Vue组件中如何引入iframe?2、vue如何获取iframe对象以及iframe内的window对象?3、vue如何向iframe内传送信息...
    99+
    2022-11-13
    vue内嵌iframe跨域通信 vue内嵌iframe vue内嵌 vue跨域
  • JSONP跨域原理以及实现方法详解
    目录前言一、同源策略和跨域1.1 同源策略1.1.1 什么是同源1.1.2 什么是同源策略1.2 跨域1.2.1 什么是跨域1.2.2 浏览器对跨域请求的拦截1.2.3 如何实现跨域...
    99+
    2024-04-02
  • VUE跨域详解以及常用解决跨域的方法
    目录跨域解决跨域常用方法:一、VUE中常用proxy来解决跨域问题二、JSONP解决跨域 三、CORS是跨域资源共享(Cross-Origin Resource Shari...
    99+
    2024-04-02
  • Vue中iframe怎么结合window.postMessage实现跨域通信
    这篇文章主要介绍“Vue中iframe怎么结合window.postMessage实现跨域通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中iframe怎么结合window.postMess...
    99+
    2023-07-04
  • Vue怎么使用postMessage实现父子跨域通信
    这篇文章主要讲解了“Vue怎么使用postMessage实现父子跨域通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用postMessage实现父子跨域通信”吧!一、跨域通信子...
    99+
    2023-07-04
  • JavaScript JSONP:跨域通信的终极指南
    1. JSONP 简介 JSONP(JSON with Padding)是一种用于跨域通信的技巧,它允许浏览器向其他域名的服务器发送请求并接收响应。由于同源策略的限制,浏览器通常不允许脚本从一个域加载资源或与另一个域通信。JSONP 通...
    99+
    2024-02-24
    JSONP 跨域通信 同源策略 AJAX XMLHttpRequest
  • JavaScript JSONP:跨域通信的必备技能
    理解 JSONP 的工作原理 JSONP 利用了标签的跨域特性来实现数据交换。当浏览器遇到标签时,它会向指定 URL 发起请求并加载脚本文件。由于标签没有同源限制,因此浏览器可以向任何域的服务器发起请求。 当服务器收到请求后,它会将数据...
    99+
    2024-02-24
    JSONP 跨域通信 浏览器 服务器 数据交换
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作