<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        jQuery Ajax async=&gt;false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 21:53:34
        文檔

        jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題

        jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題:今天做一個需求遇到了這么個情況,就是用戶個人中心有個功能,點(diǎn)擊按鈕,可以刷新用戶當(dāng)前的積分,這個肯定需要使用到ajax的同步請求了,當(dāng)時喀喀喀三下五除二寫玩了,大概代碼如下: /** * 異步當(dāng)前用戶積分 by zgw 20161216 * @return {[ty
        推薦度:
        導(dǎo)讀jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題:今天做一個需求遇到了這么個情況,就是用戶個人中心有個功能,點(diǎn)擊按鈕,可以刷新用戶當(dāng)前的積分,這個肯定需要使用到ajax的同步請求了,當(dāng)時喀喀喀三下五除二寫玩了,大概代碼如下: /** * 異步當(dāng)前用戶積分 by zgw 20161216 * @return {[ty

        今天做一個需求遇到了這么個情況,就是用戶個人中心有個功能,點(diǎn)擊按鈕,可以刷新用戶當(dāng)前的積分,這個肯定需要使用到ajax的同步請求了,當(dāng)時喀喀喀三下五除二寫玩了,大概代碼如下:

        /**
         * 異步當(dāng)前用戶積分 by zgw 20161216
         * @return {[type]} [description]
         */
         function flushIntegralSum() {
             //點(diǎn)擊按鈕刷新前修改按鈕的文案,已經(jīng)去掉點(diǎn)擊事情,防止多次點(diǎn)擊
         $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>');
         $.ajax({
         url:'URL',
         type:'post',
         async:false,
         // data:{},
         success:function(json){
         json = eval('('+json+')');
         if(json.url){window.location.href=json.url;return;}
         $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新積分</a>');
         if(json.code!=1){
         alert(json.msg);
         }else{
         $("#free_sum").html(json.free_sum);
         }
         return;
         }
         });
         }

        本以為這么簡單的功能喀喀喀隨便寫寫就沒事了,在運(yùn)行的時候出現(xiàn)了問題,當(dāng)用戶點(diǎn)擊刷新積分按鈕時,文案沒有修改為"正在刷新",但是ajax請求發(fā)送了,于是我查看網(wǎng)頁代碼,發(fā)現(xiàn)js其實(shí)把文案和html元素綁定的onclick事件去掉了,在請求成功后有變回原來的了,但是頁面上邊文案沒有改變,當(dāng)時很奇怪,不知道為什么html代碼里邊改變了,頁面卻沒有變點(diǎn)變化

        二、了解問題原因

        問題的根源:當(dāng)時我進(jìn)行了排查,最后發(fā)現(xiàn)是 "async:false" 的問題,換成異步的就沒有問題了,那為什么同步請求會產(chǎn)生代碼失效的問題呢?

        原因:瀏覽器的渲染(UI)線程和js線程是互斥的,在執(zhí)行js耗時操作時,頁面渲染會被阻塞掉。當(dāng)我們執(zhí)行異步ajax的時候沒有問題,但當(dāng)設(shè)置為同步請求時,其他的動作(ajax函數(shù)后面的代碼,還有渲染線程)都會停止下來。即使我的DOM操作語句是在發(fā)起請求的前一句,這個同步請求也會“迅速”將UI線程阻塞,不給它執(zhí)行的時間。這就是代碼失效的原因。

        三、解決問題

        1.我當(dāng)時使用了 setTimeout 來解決,把a(bǔ)jax代碼放在sestTimeout中,讓瀏覽器重啟一個線程來操作,這樣就解決問題了,代碼如下:

        function flushIntegralSum() {
             //點(diǎn)擊按鈕刷新前修改按鈕的文案,已經(jīng)去掉點(diǎn)擊事情,防止多次點(diǎn)擊
         $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>');
         setTimeout(function(){
         $.ajax({
         url:'URL',
         type:'post',
         async:false,
         // data:{},
         success:function(json){
         json = eval('('+json+')');
         if(json.url){window.location.href=json.url;return;}
         $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新積分</a>');
         if(json.code!=1){
         alert(json.msg);
         }else{
         $("#free_sum").html(json.free_sum);
         }
         return;
         }
         });
         },0) 
         }

        setTimeout的第二個參數(shù)設(shè)為0,瀏覽器會在一個已設(shè)的最小時間后執(zhí)行

        到這里問題就解決了,但是你可以試試當(dāng)你點(diǎn)擊按鈕的時候如果需要彈出一個gif圖片,并且圖片一直在旋轉(zhuǎn),提示更新中,你會發(fā)現(xiàn)圖片雖然會顯示,但是圖片卻是不動的,那是因?yàn)殡m然同步請求延遲執(zhí)行了,但是它執(zhí)行期間還是會把UI線程給阻塞。這個阻塞相當(dāng)牛逼,連gif圖片都不動了,看起來像一張靜態(tài)圖片一樣。結(jié)論很明顯,setTimeout治標(biāo)不治本,相當(dāng)于把同步請求“稍稍”異步了一下,接下來還是會進(jìn)入同步的噩夢,阻塞線程,這種方法只適合發(fā)請求之前操作簡單的時間短的情況

        2.使用 Deferred 來解決

        jQuery在1.5版本之后,引入了Deferred對象,提供的很方便的廣義異步機(jī)制。

        function getData3(){ var defer = $.Deferred();
         $.ajax({
         url : 'p.php', //async : false,
         success: function(data){
         defer.resolve(data)
         }
         }); return defer.promise();
        } 
        $('.btn3').click(function(){
         $('.loadingicon').show();
         $.when(getData3()).done(function(data){
         $('.loadingicon').hide();
         alert(data);
         });
        });

        可以看到我在ajax請求中去掉了async:false,也就是說,這個請求又是異步的了。另外請注意success函數(shù)中的這一句:defer.resolve(data),Deferred對象的resolve方法可傳入一個參數(shù),任意類型。這個參數(shù)可以在done方法中拿到,所以我們異步請求來的數(shù)據(jù)就可以以這樣的方式來返回了。

        至此,問題得到了解決。Deferred對象如此強(qiáng)大且方便,我們可以好好利用它。

        <button class="btn1">async:false</button><button class="btn2">setTimeout</button><button class="btn3">deferred</button>
         <img class="loadingicon" style="position:fixed;left:50%;top:50%;margin-left:-16px;margin-top:-16px;display:none;" src="loading2.gif" alt="正在加載" /><script>
         function getData1(){ var result;
         $.ajax({
         url : 'p.php',
         async : false,
         success: function(data){
         result = data;
         }
         }); return result;
         }
         $('.btn1').click(function(){
         $('.loadingicon').show(); var data = getData1();
         $('.loadingicon').hide();
         alert(data);
         });
         
         $('.btn2').click(function(){
         $('.loadingicon').show();
         setTimeout(function(){
         $.ajax({
         url : 'p.php',
         async : false,
         success: function(data){
         $('.loadingicon').hide();
         alert(data);
         }
         });
         }, 0);
         }); function getData3(){ var defer = $.Deferred();
         $.ajax({
         url : 'p.php', //async : false, success: function(data){
         defer.resolve(data)
         }
         }); return defer.promise();
         } 
         $('.btn3').click(function(){
         $('.loadingicon').show();
         $.when(getData3()).done(function(data){
         $('.loadingicon').hide();
         alert(data);
         });
         });</script>
        

        以上這篇jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題

        jQuery Ajax async=>false異步改為同步時,解決導(dǎo)致瀏覽器假死的問題:今天做一個需求遇到了這么個情況,就是用戶個人中心有個功能,點(diǎn)擊按鈕,可以刷新用戶當(dāng)前的積分,這個肯定需要使用到ajax的同步請求了,當(dāng)時喀喀喀三下五除二寫玩了,大概代碼如下: /** * 異步當(dāng)前用戶積分 by zgw 20161216 * @return {[ty
        推薦度:
        標(biāo)簽: 瀏覽器 問題 的問題
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 韩国亚洲伊人久久综合影院| 久久精品国产亚洲AV无码麻豆| 亚洲日韩AV一区二区三区四区 | 成年网在线观看免费观看网址| 性做久久久久免费观看| 亚洲日韩av无码中文| 24小时免费直播在线观看| 国产日本亚洲一区二区三区| 精品熟女少妇AV免费观看| 亚洲aⅴ天堂av天堂无码麻豆| 色吊丝最新永久免费观看网站 | 国产精品免费久久久久影院| 中文字幕亚洲乱码熟女一区二区 | 亚洲av无码一区二区三区观看| 亚洲成人免费网站| 波多野结衣亚洲一级| 日本19禁啪啪无遮挡免费动图| 黄页网站在线免费观看| AV在线播放日韩亚洲欧| a级男女仿爱免费视频| 亚洲精品**中文毛片| 日本一区免费电影| 国产精品内射视频免费| 亚洲AV无码第一区二区三区| 亚洲视频免费在线看| 色偷偷噜噜噜亚洲男人| 国产亚洲综合一区柠檬导航| 黄色网址免费观看| 朝桐光亚洲专区在线中文字幕| 亚洲人成无码网站久久99热国产| 暖暖日本免费中文字幕| 亚洲国产欧美一区二区三区| 国产乱辈通伦影片在线播放亚洲| 亚洲视频在线免费播放| 免费一级全黄少妇性色生活片 | 亚洲AV无一区二区三区久久| 在线v片免费观看视频| 一级毛片高清免费播放| 亚洲综合久久综合激情久久| 在线免费观看国产视频| 无码人妻丰满熟妇区免费|