導航:首頁 > 編程語言 > js原生非同步怎麼寫

js原生非同步怎麼寫

發布時間:2023-08-03 12:11:55

① 原生js怎麼非同步請求實現Ajax

來來來來 現場自給你封一個ajax
function ajaxGet(url){
var xhr=new XMLHttpRequest();
xhr.open('GET',url);
xhr.send();
var promise=new Promise(function(resolved,rejected){
xhr.onload=function(){
if(xhr.status===200){
resolved(xhr.response);
}else{
rejected("請求失敗,錯誤碼為:"+xhr.status);
}
}
})
return promise;
}

② 求大神原生JS的ajax處理json數據格式的非同步請求完整例子,最好能寫出面向對象的形式。



//以post方式發送數據為例
functionchuFa(){//html元素事件觸發的函數
varmyXMLHttpRequest=null;
if(window.ActiveXObject){
myXMLHttpRequest=newActiveXObject("Microsoft.XMLHTTP");
}else{
myXMLHttpRequest=newXMLHttpRequest();
}
varurl="xxx.php";
vardata="key=val";//val一般是從某個html元素中取出的value值
myXMLHttpRequest.open("post",url,true);
myXMLHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
myXMLHttpRequest.onreadystatechange=function(){
if(myXMLHttpRequest.readyState==4&&myXMLHttpRequest.status==200){
varres=myXMLHttpRequest.responseText;
varjsonObj=eval("("+res+")");
//接下來就可以使用jsonObj這個json對象取出其中的屬性值,做一些修改html元素value值等操作了。
}
}
myXMLHttpRequest.send(data);
}
</script

③ js非同步問題怎麼解決

非同步載入又叫非阻塞載入,瀏覽器在下載執行js的同時,還會繼續進行後續頁面的處理。主要有三種方式。
方法一:也叫Script DOM Element
(function(){
var scriptEle = document.createElement("script");
scriptEle.type = "text/javasctipt";
scriptEle.async = true;
scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js";
var x = document.getElementsByTagName("head")[0];
x.insertBefore(scriptEle, x.firstChild);
})();

<async>屬性是HTML5中新增的非同步支持。此方法被稱為Script DOM Element 方法。Google Analytics 和 Google+ Badge 都使用了這種非同步載入代碼
(function(){;
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();

但是這種載入方式執行完之前會阻止onload事件的觸發,而現在很多頁面的代碼都在onload時還執行額外的渲染工作,所以還是會阻塞部分頁面的初始化處理。
方法二:onload時的非同步載入
(function(){
if(window.attachEvent){
window.attachEvent("load", asyncLoad);
}else{
window.addEventListener("load", asyncLoad);
}
var asyncLoad = function(){
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
}
)();

這種方法只是把插入script的方法放在一個函數裡面,然後放在window的onload方法裡面執行,這樣就解決了阻塞onload事件觸發的問題。
注:DOMContentLoaded與load的區別。前者是在document已經解析完成,頁面中的dom元素可用,但是頁面中的圖片,視頻,音頻等資源未載入完,作用同jQuery中的ready事件;後者的區別在於頁面所有資源全部載入完畢。
方法三:其他方法
由於JavaScript的動態性,還有很多非同步載入方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer屬性、 document.write(script tag)。
XHR Injection(XHR 注入):通過XMLHttpRequest來獲取javascript,然後創建一個script元素插入到DOM結構中。ajax請求成功後設置script.text為請求成功後返回的responseText。
//獲取XMLHttpRequest對象,考慮兼容性。
var getXmlHttp = function(){
var obj;
if (window.XMLHttpRequest)
obj = new XMLHttpRequest();
else
obj = new ActiveXObject("Microsoft.XMLHTTP");
return obj;
};
//採用Http請求get方式;open()方法的第三個參數表示採用非同步(true)還是同步(false)處理
var xmlHttp = getXmlHttp();
xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true);
xmlHttp.send();
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
var script = document.createElement("script");
script.text = xmlHttp.responseText;
document.getElementsByTagName("head")[0].appendChild(script);
}
}

XHR Eval:與XHR Injection對responseText的執行方式不同,直接把responseText放在eval()函數裡面執行。
//獲取XMLHttpRequest對象,考慮兼容性。
var getXmlHttp = function(){
var obj;
if (window.XMLHttpRequest)
obj = new XMLHttpRequest();
else
obj = new ActiveXObject("Microsoft.XMLHTTP");
return obj;
};
//採用Http請求get方式;open()方法的第三個參數表示採用非同步(true)還是同步(false)處理
var xmlHttp = getXmlHttp();
xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true);
xmlHttp.send();
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
eval(xmlHttp.responseText);
//alert($);//可以彈出$,表明JS已經載入進來。click事件放在其它出會出問題,應該是還沒載入進來
$("#btn1").click(function(){
alert($(this).text());
});
}
}

Script In Irame:在父窗口插入一個iframe元素,然後再iframe中執行載入JS的操作。
var insertJS = function(){alert(2)};
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
var doc = iframe.contentWindow.document;//獲取iframe中的window要用contentWindow屬性。
doc.open();
doc.write("<script>var insertJS = function(){};<\/script><body onload='insertJS()'></body>");
doc.close();

GMail Mobile:業內JS內容被注釋,所以不會執行,在需要的時候,獲取script中的text內容去掉注釋,調用eval()執行。
<script type="text/javascript">
/*
var ...
*/
</script>

HTML5新屬性:async和defer屬性
defer屬性:IE4.0就出現。defer屬聲明腳本中將不會有document.write和dom修改。瀏覽器會並行下載其他有defer屬性的script。而不會阻塞頁面後續處理。註:所有的defer腳本必須保證按順序執行的。
<script type="text/javascript" defer></script>

async屬性:HTML5新屬性。腳本將在下載後盡快執行,作用同defer,但是不能保證腳本按順序執行。他們將在onload事件之前完成。
<script type="text/javascript" defer></script>

Firefox 3.6、Opera 10.5、IE 9和最新的Chrome和Safari都支持async屬性。可以同時使用async和defer,這樣IE 4之後的所有IE都支持非同步載入。
沒有async屬性,script將立即獲取(下載)並執行,期間阻塞了瀏覽器的後續處理。如果有async屬性,那麼script將被非同步下載並執行,同時瀏覽器繼續後續的處理。
總結: 對於支持HTML5的瀏覽器,實現JS的非同步載入只需要在script元素中加上async屬性,為了兼容老版本的IE還需加上defer屬性;對於不支持HTML5的瀏覽器(IE可以用defer實現),可以採用以上幾種方法實現。原理基本上都是向DOM中寫入script或者通過eval函數執行JS代碼,你可以把它放在匿名函數中執行,也可以在onload中執行,也可以通過XHR注入實現,也可以創建一個iframe元素,然後在iframe中執行插入JS代碼。

④ js如何非同步執行方法

functionmyThread(callback){

returnsetTimeout(1000*10,function(){

$("#div").append("<p>hello</p>");//10秒後在div中加一個行,然後在執行callback函數

callback();

});

}

用回調內函容數

functionA(fun){

vartemp=100;

temp=temp*temp;

window.setTimeout(function(){

fun(temp);

},0);

alert("a函數:"+temp);

}

functionB(r){

alert("b函數"+r);

}

A(B);//調用
閱讀全文

與js原生非同步怎麼寫相關的資料

熱點內容
猥瑣貓表情教程 瀏覽:599
android音頻文件格式 瀏覽:458
漫畫臉app哪裡可以下載 瀏覽:959
購買歡樂升級歡樂豆 瀏覽:282
學習智能機器人用什麼編程最好 瀏覽:655
蘋果手機如何管控app 瀏覽:633
mn文件夾 瀏覽:590
安卓平板通用刷機包下載 瀏覽:751
安卓獲取內部存儲路徑 瀏覽:880
寫代碼兩台顯示器 瀏覽:327
unitypackage壓縮文件 瀏覽:493
奕心安卓 瀏覽:563
使用土地的有關證明文件包含哪些 瀏覽:493
數據標注哪裡可以接 瀏覽:482
在家自學編程下什麼學 瀏覽:705
最近很火的app軟體是什麼軟體 瀏覽:862
ai文字工具 瀏覽:157
蘭博玩游戲路徑怎麼選擇正確文件 瀏覽:972
淘寶直通車恢復老版本 瀏覽:510
播放草莓的圖片我都文件 瀏覽:55

友情鏈接