jQuery ajax時(shí)間差導(dǎo)致的變量賦值問題分析
本文實(shí)例分析了jQuery ajax時(shí)間差導(dǎo)致的變量賦值問題。分享給大家供大家參考,具體如下:
ajax異步請求,在各種特效方面,做出了不少的貢獻(xiàn),有了它讓用戶體驗(yàn)更好。下面說一下曾今遇到過的一個(gè)問題,今天又遇到了,又花了我一點(diǎn)時(shí)間,小問題,但是特別容易忽視,并且不容易想到是什么原因產(chǎn)生的。廢話不多說,舉個(gè)例子大家就明白了。
一、準(zhǔn)備測試文件test.php和test.html
1. test.php
<?php echo "1"; ?>
2. test.html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <script type="text/javascript" src="jquery-1.3.2.min.js"></script> </head> <body> <div>www.dbjr.com.cn</div> </body> </html> <script type="text/javascript"> //js代碼放到這里 </script>
二、問題舉例
<script type="text/javascript">
function test(value){ //定義一個(gè)function
error = false; //定義一個(gè)測試變量
$.ajax({ //ajax異步請求
type: "POST", //傳值方式post
url: "test.php", //異步請求的文件
data: "name="+value, //異步請求的參數(shù)
success: function(msg){ //請求成功的回調(diào)函數(shù)
if($.trim(msg) == '1'){
error = true; //返回值為1,把error變成true
}
}
});
alert(error); //打印一下error的內(nèi)容,在這里你知道它會(huì)彈出什么嗎?
if(error == true){
$("div").remove();
}
}
test("good");
</script>
代碼中的alert(error);不管msg返回什么,都只會(huì)彈出false,按javascript的執(zhí)行原理,一般情況下都是順序執(zhí)行的,那為什么這個(gè)error的值沒有被改變呢?原因就在于異步請求是有一個(gè)時(shí)間差的,為了驗(yàn)證這個(gè)時(shí)間差,在舉個(gè)例子,可以讓你清楚的看到,這個(gè)時(shí)間差。
三、驗(yàn)證ajax異步請求的時(shí)間差
<script type="text/javascript">
function test(value){
error = false;
$.ajax({
type: "POST",
url: "test.php",
data: "name="+value,
success: function(msg){
if($.trim(msg) == '1'){
error = true;
alert(error); //在這里打印一下error
}
}
});
alert(error); //在這里打印一下error
if(error == true){
$("div").remove();
}
}
test("good");
</script>
當(dāng)你刷新頁面后,問題就很清楚,它首先彈出的是false,然后彈出了true,二次彈出之間的時(shí)間差,就是ajax異步請求的時(shí)間差。從表面上看,這段js代碼的執(zhí)行順序是這樣的上--下--中,其實(shí)不是這樣的,代碼執(zhí)行的順序還是上--中--下。為什么會(huì)先執(zhí)行下面的代碼呢?那是因?yàn)閍jax異步請求,需要時(shí)間,而js并沒有去等待,所以在這里有一個(gè)時(shí)間差。
四、解決方法
1. 把實(shí)際要操作的動(dòng)作放到回調(diào)函數(shù)中,逃避這個(gè)時(shí)間差
<script type="text/javascript">
function test(value){
$.ajax({
type: "POST",
url: "test.php",
data: "name="+value,
success: function(msg){
$("div").remove(); //實(shí)際要操作的動(dòng)作
}
});
}
test("good");
</script>
前面幾個(gè)例子,是為了舉例,真正寫代碼,不會(huì)那樣寫,哈哈。
2. 進(jìn)行同步請求
<script type="text/javascript">
function test(value){
error = false;
$.ajax({
type: "POST",
url: "test.php",
async: false, //進(jìn)行同步請求,默認(rèn)是true的
data: "name="+value,
success: function(msg){
if($.trim(msg) == '1'){
error = true;
alert(error); //彈一下error
}
}
});
alert(error); //在彈一下error
if(error == true){
$("div").remove();
}
}
test("good");
</script>
當(dāng)你刷新頁面時(shí),這里是彈出二個(gè)true,為什么會(huì)這樣呢?加了async:false后,就會(huì)有一個(gè)等待的過程,也就是說ajax不執(zhí)行完,不執(zhí)行下面的代碼。用這個(gè)方法有個(gè)問題,如果等待的時(shí)間過長,用戶體驗(yàn)很不好的。
更多關(guān)于jQuery ajax相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《jquery中Ajax用法總結(jié)》
希望本文所述對大家jQuery程序設(shè)計(jì)有所幫助。
- jQuery validate插件實(shí)現(xiàn)ajax驗(yàn)證重復(fù)的2種方法
- Jquery中巧用Ajax的beforeSend方法
- 實(shí)例詳解jQuery Mockjax 插件模擬 Ajax 請求
- PHP結(jié)合Jquery和ajax實(shí)現(xiàn)瀑布流特效
- 簡述jQuery ajax的執(zhí)行順序
- jquery中ajax處理跨域的三大方式
- jQuery+Ajax實(shí)現(xiàn)無刷新操作
- php+jQuery+Ajax實(shí)現(xiàn)點(diǎn)贊效果的方法(附源碼下載)
- jQuery+ajax實(shí)現(xiàn)文章點(diǎn)贊功能的方法
- jQuery+JSON實(shí)現(xiàn)AJAX二級聯(lián)動(dòng)實(shí)例分析
- JQuery中Ajax()的data參數(shù)類型實(shí)例分析
- jQuery使用$.ajax提交表單完整實(shí)例
相關(guān)文章
jQuery鼠標(biāo)經(jīng)過方形圖片切換成圓邊效果代碼分享
這篇文章主要介紹了jQuery鼠標(biāo)經(jīng)過方形圖片切換成圓邊特效,圖片可以自行替換,推薦給大家,有需要的小伙伴可以參考下。2015-08-08
jquery 實(shí)現(xiàn)兩Select 標(biāo)簽項(xiàng)互調(diào)示例代碼
這篇文章主要與大家分享了jquery實(shí)現(xiàn)兩Select標(biāo)簽項(xiàng)互調(diào)的具體實(shí)現(xiàn),比較簡單,比較實(shí)用2014-09-09
jquery實(shí)現(xiàn)拖拽調(diào)整Div大小
這里給大家分享的是一段自己編寫的使用jQuery實(shí)現(xiàn)拽調(diào)整Div層大小的代碼,非常實(shí)用,推薦給有需要的小伙伴們。2015-01-01
firefox瀏覽器用jquery.uploadify插件上傳時(shí)報(bào)HTTP 302錯(cuò)誤
這篇文章主要介紹了firefox瀏覽器用jquery.uploadify插件上傳時(shí)報(bào)HTTP 302錯(cuò)誤,分析了下,原來是利用flash進(jìn)行post上傳時(shí)沒有包含原來的session信息,而是重新創(chuàng)建了一個(gè)session,知道原因了,我們來看看如何解決吧。2015-03-03
jQuery實(shí)現(xiàn)的淡入淡出圖片輪播效果示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)的淡入淡出圖片輪播效果,涉及jQuery基于定時(shí)器的頁面元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08
jQuery仿gmail實(shí)現(xiàn)fixed布局的方法
這篇文章主要介紹了jQuery仿gmail實(shí)現(xiàn)fixed布局的方法,涉及jQuery操作頁面元素屬性的相關(guān)技巧,需要的朋友可以參考下2015-05-05

