実際のところ、ネイティブ JS に対するいわゆる馴染みとは何でしょうか?
最近私はネイティブ JS を使っておなじみの演習を行っています。 。 。
ネイティブ JS を使用して Ajax プラグインをカプセル化し、一般的なプロジェクトを導入し、データを転送します。 。 。考え方を簡単に説明してください。間違っているところがあれば修正してください^_^
1. Ajax コア、XHR オブジェクトの作成
Ajax テクノロジの中核は、XMLHttpRequest オブジェクト (略して XHR) です。IE5 の XHR オブジェクトは、MSXML ライブラリの ActiveX オブジェクトを通じて実装されているため、XHR オブジェクトを導入することができます。 IE MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0 の 3 つのバージョンがあります。したがって、XHR オブジェクトを作成するときは、互換性のある記述を使用する必要があります:
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."); } }
2. XHR の主なメソッド属性
方法:
open() メソッド: 送信するリクエストのタイプ、リクエストの URL、非同期に送信するかどうかを示すブール値の 3 つのパラメータを受け入れます
send() メソッド: リクエスト本文として送信するデータ。リクエスト本文を通じてデータを送信する必要がない場合は、null
を渡す必要があります。abort() メソッド: 非同期リクエストをキャンセルするための応答を受信する前に呼び出されます。
プロパティ:
responseText: 応答本文として返されるテキスト。
status: 応答の HTTP ステータス
statusText: HTTP ステータスの説明
readyState: 要求/応答プロセスの現在アクティブな段階を示します
の値は次のとおりです:
0: 初期化されていません。 open() メソッドはまだ呼び出されていません
1: 開始します。 open() メソッドは呼び出されていますが、send() メソッドはまだ呼び出されていません
2: 送信します。 send() メソッドが呼び出されましたが、応答が受信されませんでした。
3: 受け取ります。部分的な応答データを受信しました
4: 完了。すべての応答データが受信され、クライアントで使用できるようになりました。
この例の onreadystatechange イベント ハンドラー:
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); } } } }
注: ブラウザ間の互換性を確保するには、open() メソッドを呼び出す前に onreadystatechange イベント ハンドラーを指定する必要があります。
3. 同じドメインでリクエストを送信します
①GETリクエスト
最も一般的なリクエスト タイプ。特定の情報をクエリするためによく使用されます。情報は、クエリの文字列パラメーターを URL の末尾に追加することによってサーバーに送信されます。 get メソッドのリクエストで注意すべき点の 1 つは、クエリ文字列内の各パラメーターの名前と値は encodeURIComponent() を使用してエンコードする必要があり、すべての名前と値のペアをアンパサンドで区切る必要があることです。
リクエスト方法:
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); }
②POSTリクエスト
通常、サーバーに保存する必要があるデータを送信するために使用されます。POST リクエストでは、リクエストの本文としてデータを送信する必要があります。これにより、フォームの送信がシミュレートされます。つまり、Content-Type ヘッダー情報を application/x-www-form-urlencoded に設定します。
シリアル化関数:
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); }
リクエスト方法:
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)); }
两个请求的一些区别:
①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&¶ms.fail({message:"over time"}); window[cbName]=null; },params.time); }
以上就是本文的全部内容,希望对大家的学习有所帮助。
插件详细解析及使用方法见:https://github.com/LuckyWinty/AjaxPlugin