ajax問題まとめ比較全

12391 ワード

基本的な=============================
1,最も古典的なのはieの下のキャッシュの問題です.
getを使用している場合、ieの下でキャッシュの問題が発生します.コードは一度だけ実行されます.解決策はタイムスタンプや乱数を加えてurlを一意にし、ieが現れないようにすることです.
のキャッシュに問題があるか、postコミットに変更します.
xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true);
2,ajaxオブジェクト属性の大文字と小文字の問題はw 3 cブラウザ、例えばffで、大文字と小文字に敏感である.のように
if(xhr.readystate==4)という書き方はieの下では成立しますが、ffの下では通用しません.ieは大文字と小文字を区別しないので、ffは大きさを区別します.
標準表記はif(xhr.readyState==4)であり、同様に属性responseText,responseXML,statusもある.
状態変換関数xhrもある.onreadystatechange、すべて小文字に注意
3,ajax状態0の問題
ajaxコードをテストするときにxhrを追加することがあります.status==200の判断後、xhrを実行しない.status==200のコードですが、これは注意が必要です.
xhr.status==200は、サーバを介してブラウズされ、サーバページにエラーが発生していないか、転向していない場合に200のステータスに戻ります.このステータスは、ブラウザを介してページにアクセスしたときにサーバが定義したステータスと一致します.
ブラウザブラウズ結果に直接ドラッグするかhtmlページをダブルクリックして実行し、エラーが発生しない場合のxhr.statusは0で、200ではありません.
xhrを1つ追加することができますstatus=0の判断.次のように
 
  
if(xhr.status==200||xhr.status==0){
alert('ok');
}

ブラウザに直接ドラッグして結果をブラウズしたり、htmlページをダブルクリックして実行したりすると、xmlファイルが要求された場合、当然responseXMLプロパティを使用してxmlDomに戻ると思いますが、ieではxmlDomプロパティを返すことができません.解決方法はどうですか.次のresponseXML問題を見てください.
4,responseXML問題.
responseXMLプロパティを使用するには、xmlファイルが要求されるか、応答ヘッダが「text/xml」に設定されたダイナミックページが要求されます.ダイナミックページをリクエストした場合は、contenttypeを「text/xml」に設定することを忘れないでください!!!覚えておいて~~~~~
aspはresponse.contenttype="text/html"
asp.NetはResponse.ContentType="text/html";
phpはheader(「content-type:text/xml;」);
ieの下で質問があり、ブラウザに直接ドラッグしてブラウズしたり、htmlプレビュー効果をダブルクリックして実行したりすると、要求されたxmlファイルでもresponseXMLではxmldomを返すことができません.
みんなはテストして知っていて、以下の通りです
showbo.xml
 
  

1item>
2item>
3item>
4item>


test.html
 
  
function getajax(){
if(window.XMLHttpRequest)return new XMLHttpRequest();
else if(window.ActiveXObject)return new ActiveXObject("microsoft.xmlhttp");
}
var xhr=getajax();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status==200||xhr.status==0){
var doc=xhr.responseXML,item=doc.getElementsByTagName("item");
alert(item.length);// ie 0, ff 4。 ie xml , ms 。。
}
else alert('

'+xhr.status);
}
}
xhr.open("get","showbo.xml?_dc="+new Date().getTime(),true);
xhr.send(null);

解決策はMicrosoft.xmldomオブジェクトxmlのツリー構造を再構築するには、次のようにします.
 
  
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status==200||xhr.status==0){
var doc=xhr.responseXML;
if(document.all&&xhr.status==0){// ie xml
doc=new ActiveXObject("microsoft.xmldom");
doc.loadXML(xhr.responseText);
doc=doc.documentElement;
}
var item=doc.getElementsByTagName("item");
alert(item.length);
}
else alert('

'+xhr.status);
}
}

5、postの提出に注意する必要があります.
1)postコミットの場合、content-typeを「アプリケーション/x-www-form-urlencoded」に設定することで、動的ページでrequest/requestを使用できるようにする.form/request.querystringオブジェクトはキーで値を取得します.そうしないと、2進数データを使用して、2進数データを自分で分析して文字列オブジェクトを生成し、正則を使用して対応する値を取得します.
2)xhrを使用するにはopen以降が必要である.setRequestHeaderメソッド、そうでないとエラーが発生します.
xhr.open("post","xxxx.aspx",true);
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//ここ....
6.もう一つの問題をまとめるのを忘れました.ドメインをまたぐ問題です.
リクエストされたページが現在のサイトでない場合は、ドメイン間で、サーバ側のxhrリクエストが最善の解決策です.
次のソリューションを参照してください.
AJAXドメイン間問題解決方法
少し前に放出された
alexa,googleのapiを用いてalexaランキングとgoogle prを取得し,クライアント側とサーバ側のxhr要求をそれぞれ用いた.
では、サーバー側のxhrリクエストを使用し、Googleとalexaのページをリクエストすべきなので、ドメインをまたいで、サーバー側のxhrリクエストを使用する必要があります.
文字化けし問題
ajaxアプリケーションでは、文字化けしもよく発生する問題です.
1)metaが宣言したcharsetは,要求されたページから返されるcharsetと一致する.要求されたページに出力符号化を再設定することが望ましい.
asp: response.charset="gb 2312またはutf-8"
asp.net: response.charset="gb 2312またはutf-8"
php:header(「charset=gb 2312またはutf-8」)
2)ファイル物理記憶符号化はmetaが宣言した符号化と一致しなければならない.metaがgb 2312として指定されると、物理記憶符号化はansiとなる.utf-8の場合、utf-8符号化として格納される.
aspの場合、utf-8として符号化されている場合は、設定を忘れないでください.
 
  
' asp utf-8
Session.CodePage=65001
Response.CharSet="utf-8"

aspは国内サーバでgb 2312とデフォルトで処理されるため
aspについて.Netの場合、metaがgb 2312に設定場合は、webを設定することが望ましい.configファイルの
 
  


を選択し、中国語を出力前にResponseを設定.CharSet="gb2312";
なぜならNetデフォルトの符号化はutf-8
3)中国語から動的ページへの送信にescape/encodeURI/encodeURIComponentを用いて符号化する.encodeURIComponentの使用を推奨します.
より多くのjs符号化情報はこの文章を参照してください.
JS URL符号化関数
phpには、サーバポイント復号化の下で問題があります.この文章の中の討論を見ることができます.
phpクエリーを書いたが、中国語が伝わらなかった.
4)1-2が一致してもサーバ側から送信された情報を受信する際に文字化けしが発生した場合は,XMLを情報キャリアとして試用し,responseXMLを用いて返信されたxmlファイルを解析する.ajaxはもともとxmlを情報媒体として使っていたので....ajax英語名はもともと「非同期javascriptとxml」【asynchronous javascript and xml】
xmlファイルが解析されない場合は、この記事を参照してください.
JavaScriptがXMLを解析する方法のまとめ
以下はいくつかのcsdnに文字化けした文章と解決方法で、まだ解決していないのは、あなたと同じかどうかを見てみましょう.
FireFoxブラウザでasp.Net+AJAXが送信した中国語文字列がサーバー側に来てから文字化けした問題!!!
教えてajaxは文字化けしを返します
上の2つについて、もっと探して、このクエリーの接続を見て、ajaxが文字化けしている問題です.
http://so.csdn.net/bbsSearchResult.aspx?q=ajax+%e4%b9%b1%e7%a0%81&p=0
同期問題==============================================================http://topic.csdn.net/u/20090630/16/d4d07596-65da-430c-8e89-cae60e25e03c.html,簡略化してajaxを作成するコード
 
  
function callServerByPost(url,data,fun) {
var http_request=null;
if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP");
}else if (window.XMLHttpRequest) http_request = new XMLHttpRequest();
if (!http_request) {
alert('Giving up :Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = fun;
http_request.open("POST", url, true);
http_request.setrequestheader("Content-length",data.length);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
http_request.send(data);//
}
function ajax_post(url,data) {
url=url+"?t="+new Date();
callServerByPost(url,data,function fns(){
if(http_request.readyState == 4) {
if (http_request.status == 200) {
return http_request.responseText;// http_request.responseText
} else {
alert(" ");
}
}
});
}
function getData(){
var url="ajax_server.aspx";
var data="name=ljp&pwd=ljp";
var t=ajax_post(url,data);
alert(t);// undefined =============================
}

どうしてこの問題が発生したのですか??getData実行中のコードvar t=ajax_post(url,data);の場合、非同期が指定されているため、callServerByPostのhttp_request.send(data);//資料の転送という言葉は他のjsコードの実行を中断することはないのでgetDataの次のコードであるalert(t)を実行し続けるのでundefinedが現れる.
実はajax非同期がundefinedの問題を引き起こしただけではありません.コードvar t=ajax_をよく見てください.post(url,data);,t変数はajax_を受け入れますpostの戻り値ですがajax_post関数ではreturnを使用して値が返されないため、デフォルトではundefinedが返されます.
ここではreturn httpを使っていないと言います.request.responseText;//ここではデバッグ時にhttp_request.responseTextはすでに値がありますが外では受信できませんか???
みんなははっきり见て、それは状态の変换関数で、あなたはいかなる値を返すのは意味がなくて、彼はただajaxの状态を処理して、あなたは値を返して谁に使いますか???そうですか.
どうやってこの問題を解決しますか?
1つは同期送信に変更することです
1つは、非同期時にグローバル変数を使用してajaxの戻り値を受け入れ、ステータス変換関数でグローバル変数に値を割り当てることです.
非同期+グローバル変数を使用する場合は、ajaxが返さない前にグローバル変数を使用しないか、undefinedを使用しないかに注意してください.
同期の解決策を次に示します.非同期+グローバル変数の解決方法この文章を見て
なぜ配列がパラメータとして渡されて値が取れないのですか?
 
  
function callServerByPost(url,data,fun) {
var http_request=null;
if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP");
}else if (window.XMLHttpRequest) http_request = new XMLHttpRequest();
if (!http_request) {
alert('Giving up :Cannot create an XMLHTTP instance');
return false;
}
// http_request.onreadystatechange = fun; // 。。。。。。。
http_request.open("POST", url, false);//
http_request.setrequestheader("Content-length",data.length);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
http_request.send(data);//
return http_request.responseText;// ,
}
function ajax_post(url,data) {
url=url+"?t="+new Date();
return callServerByPost(url,data,null);// , callServerByPost
}
function getData(){
var url="ajax_server.aspx";
var data="name=ljp&pwd=ljp";
var t=ajax_post(url,data);
alert(t);// undefined 。。。。。。。。。。。。, , 。。
}

以下はffとieの状態転換の異同を紹介するので、興味のある参考の下で
FirefoxでのAJAX onreadystatechangeの問題
最后に1つの自分で书くajax类库~~~~O(∩∩)Oははは~~~~终わります
 
  
String.prototype.trim=function(){return this.replace(/$\s*|\s*$/g,'');}
var Showbo={author:'showbo'};
// json
Showbo.getJson=function(v){if(typeof(v)=='string')return eval('('+v+')');else return v;}
// id
Showbo.$=function(Id){if('object'==typeof(Id))return Id;else if('string'==typeof(Id))return document.getElementById(Id);else return null;}
Showbo.IsIE=!!document.all;
// IE XMLHttpRequest
if(Showbo.IsIE&&!window.XMLHttpRequest)window.XMLHttpRequest=function(){
var acX=['msxml2.xmlhttp.5.0','msxml2.xmlhttp.4.0','msxml2.xmlhttp.3.0','msxml2.xmlhttp','microsoft.xmlhttp'],Xhr;
for(var i=0;itry{Xhr=new ActiveXObject(acX[i]);return Xhr;}catch(e){}
return false;
}
//ajax
Showbo.Ajax={
pools:[]// ajax
,getObject:function(){// ajax , ajax
for(var i=0;iif(this.pools[i].readyState==0||this.pools[i].readyState==4)return this.pools[i];
this.pools[this.pools.length]=new XMLHttpRequest();
return this.pools[this.pools.length-1];
}
,send:function(cfg){/*cfg
{
url:' '
,params:' , json '
,method:'post/get, get'
,success:
,failure:
,otherParams: , json
}
( xhr , otherParams)
*/
if(!cfg||!cfg.url)throw(" !");
var method=cfg.method,asy="boolean"==typeof(cfg.asy)?cfg.asy:true;
if(!method||method!="post")method="get";
if(method.toLocaleLowerCase()=='get'){
var _dc=new Date().getTime();// ie
cfg.params=cfg.params?cfg.params+'&_dc='+_dc:'_dc='+_dc;
if(cfg.url.indexOf("?")!=-1)cfg.url+="&"+cfg.params;
else cfg.url+="?"+cfg.params;cfg.params=null;
}
else if(!cfg.params)cfg.params='';
var o=this.getObject();
if(!o)throw(" ajax !");
o.open(method,cfg.url,asy);
if(method.toLocaleLowerCase()=='post')o.setRequestHeader("content-type","application/x-www-form-urlencoded");
o.send(cfg.params);
o.onreadystatechange=function(){
if(o.readyState==4){
if(o.status==200||o.status==0){
if("function"==typeof(cfg.success))cfg.success(o,cfg.otherParams);
}
else if("function"==typeof(cfg.failure))cfg.failure(o,cfg.otherParams);
}
}
}
}