Heim > Web-Frontend > js-Tutorial > Hauptteil

Natives JS-gekapseltes Ajax-Plug-in (gleiche Domäne, JSONP domänenübergreifend)_Javascript-Kenntnisse

WBOY
Freigeben: 2016-05-16 15:02:43
Original
2108 Leute haben es durchsucht

Was ist tatsächlich die sogenannte Vertrautheit mit nativem JS?

Vor Kurzem habe ich bekannte Übungen mit nativem JS durchgeführt. . .

Es verwendet natives JS, um ein Ajax-Plug-In zu kapseln, allgemeine Projekte einzuführen und Daten zu übertragen. . . Erklären Sie kurz die Idee. Wenn etwas nicht stimmt, korrigieren Sie mich bitte^_^

1. Ajax-Kern, XHR-Objekte erstellen

Der Kern der Ajax-Technologie ist das XMLHttpRequest-Objekt (kurz XHR). Es ist der erste Browser, der das XHR-Objekt in IE5 einführt, das über ein ActiveX-Objekt in der MSXML-Bibliothek implementiert ist IE Es gibt 3 Versionen, nämlich MSXML2.XMLHttp, MSXML2.XMLHttp.3.0 und MSXML2.XMLHttp.6.0. Daher müssen Sie beim Erstellen eines XHR-Objekts die Kompatibilitätsschrift verwenden:

createXHR:function(){
 if(typeof XMLHttpRequest!='undefined'){
 return new XMLHttpRequest();
 }else if(typeof ActiveXObject!='undefined'){
 if(typeof arguments.callee.activeXString!='string'){
  var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
  for(i=0,len=versions.length;i<len;i++){
  try{
   new ActiveXObject(versions[i]);
   arguments.callee.activeXString=versions[i];
   break;
  }catch(ex){
  }
  }
  return new ActiveXObject(arguments.callee.activeXString);
  }else{
  throw new Error("No XHR object available.");
 }
}
Nach dem Login kopieren

2. Hauptmethodenattribute von XHR

Methode:

open()-Methode: akzeptiert 3 Parameter, den Typ der zu sendenden Anfrage, die URL der Anfrage und einen booleschen Wert, der angibt, ob sie asynchron gesendet werden soll

send()-Methode: Die Daten, die als Anforderungstext gesendet werden sollen. Wenn Sie keine Daten über den Anforderungstext senden müssen, müssen Sie null

übergeben

abort()-Methode: Wird vor dem Empfang der Antwort aufgerufen, um die asynchrone Anfrage abzubrechen.

Eigenschaften:

responseText: Der als Antworttext zurückgegebene Text.

Status: HTTP-Status der Antwort

statusText: HTTP-Statusbeschreibung

readyState: Zeigt die aktuell aktive Phase des Anfrage-/Antwortprozesses an

Die Werte von

sind:

0: Nicht initialisiert. Die open()-Methode wurde noch nicht aufgerufen

1: Starten. Die open()-Methode wurde aufgerufen, aber die send()-Methode wurde noch nicht aufgerufen

2: Senden. Die send()-Methode wurde aufgerufen, aber es wurde keine Antwort empfangen.

3: Empfangen. Es wurden teilweise Antwortdaten empfangen

4: Abgeschlossen. Alle Antwortdaten wurden empfangen und können auf dem Client verwendet werden.

Der onreadystatechange-Ereignishandler in diesem Beispiel:

var complete=function(){
 if(xhr.readyState==4){
  if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
  if(params.success){
   params.success(xhr.responseText);//执行调用ajax时指定的success函数
   }
 }else{
  if(params.fail){
  params.fail();//执行调用ajax时指定的fail函数
  }else{
  throw new Error("Request was unsucessful:"+xhr.status);
  }
 }
 }
}
Nach dem Login kopieren

Hinweis: Der Ereignishandler onreadystatechange muss vor dem Aufruf der open()-Methode angegeben werden, um die browserübergreifende Kompatibilität sicherzustellen.

3. Anfrage in derselben Domain senden

①GET-Anfrage

Der häufigste Anfragetyp, der häufig zur Abfrage bestimmter Informationen verwendet wird. Informationen werden an den Server gesendet, indem die Zeichenfolgenparameter der Abfrage an das Ende der URL angehängt werden. Bei Get-Methodenanforderungen ist zu beachten, dass jeder Parametername und -wert in der Abfragezeichenfolge mit encodeURIComponent() codiert werden muss und alle Name-Wert-Paare durch ein kaufmännisches Und-Zeichen getrennt werden müssen.

Anfragemethode:

if((this.config.type=="GET")||(this.config.type=="get")){
 for(var item in this.config.data){
 this.config.url=addURLParam(this.config.url,item,this.config.data[item]);//使用encodeURIComponent()进行编码
 }
 xhr.onreadystatechange=complete;
 xhr.open(this.config.type,this.config.url,this.config.async);
 xhr.send(null);
}
Nach dem Login kopieren

②POST-Anfrage

Wird normalerweise zum Senden von Daten verwendet, die auf dem Server gespeichert werden sollen. Bei POST-Anfragen sollten die Daten als Hauptteil der Anfrage übermittelt werden. Dadurch wird eine Formularübermittlung simuliert. Das heißt, setzen Sie die Content-Type-Header-Informationen auf application/x-www-form-urlencoded;

Serialisierungsfunktion:

 function serialize(data){
  var val="";
  var str="";
  for(var item in data){
   str=item+"="+data[item];
   val+=str+'&';
  }
  return val.slice(0,val.length-1);
 }

Nach dem Login kopieren

Anfragemethode:

if(this.config.type=="POST"||this.config.type=="post"){
  xhr.addEventListener('readystatechange',complete);
  xhr.open(this.config.type,this.config.url,this.config.async);
  if(params.contentType){
   this.config.contentType=params.contentType;
   }
  xhr.setRequestHeader("Content-Type",this.config.contentType);
  xhr.send(serialize(this.config.data));
}

Nach dem Login kopieren

两个请求的一些区别:

①GET请求把参数数据写到URL中,在URL中可以看到,而POST看不到,所以GET不安全,POST较安全。

②GET传送的数据量较小,不能大于2kb。POST传送的数据量较大,一般默认为不受限制。

③GET服务器端用Request.QueryString来获取变量的值,POST服务器端用Request.From来获取。

④GET将数据添加到URL中来传递到服务器,通常利用一个?,后面的参数每一个数据参数以“名称=值”的形式出现,参数与参数之间利用一个连接符&来区分。POST的数据是放在HTTP主体中的,其组织方式不只一种,有&链接方式,也有分隔符方式。可以隐藏参数,传递大批数据,比较方便。

四、jsonp跨域发送请求

首先,跨域是神马情况呢?

一个域名的组成:

http:// www . abc.com: 8080 / scripts/AjaxPlugin.js

协议 子域名 主域名 端口号 请求资源地址

~当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同于。

~不同域之间互相请求资源,就算作“跨域”。

所有的浏览器都遵守同源策略,这个策略能够保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。浏览器会阻止ajax请求非同源的内容。

JSONP(JSON with Padding) 是一种跨域请求方式。主要原理是利用了script 标签可以跨域请求的特点,由其 src 属性发送请求到服务器,服务器返回 JS 代码,网页端接受响应,然后就直接执行了,这和通过 script 标签引用外部文件的原理是一样的。但是jsonp跨域只支持get请求。

JSONP由两部分组成:回调函数和数据,回调函数一般是由网页端控制,作为参数发往服务器端,服务器端把该函数和数据拼成字符串返回。

jsonp跨域主要需要考虑三个问题:

1、因为 script 标签的 src 属性只在第一次设置的时候起作用,导致 script 标签没法重用,所以每次完成操作之后要移除;

2、JSONP这种请求方式中,参数依旧需要编码;

3、如果不设置超时,就无法得知此次请求是成功还是失败;
由于代码有点长,就放个计时器的代码吧,完整代码见AjaxPlugin

//超时处理
if(params.time){
 scriptTag.timer=setTimeout(function(){
  head.removeChild(scriptTag);
  params.fail&&params.fail({message:"over time"});
  window[cbName]=null;
 },params.time);
}
Nach dem Login kopieren

以上就是本文的全部内容,希望对大家的学习有所帮助。

插件详细解析及使用方法见:https://github.com/LuckyWinty/AjaxPlugin

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!