簡體   English   中英

Javascript:由於第3方,我的setTimeout函數不起作用

[英]Javascript: My setTimeout function not working because of 3rd party

我已經將第三方代碼整合到我的網站中,突然setTimeout和setInterval停止工作:在加載第三方之前,一切正常。 計划在加載第三方之后運行的setTimeout和setInterval根本不起作用。 刪除他們提供的第三方代碼段后,一切正常。

我的問題是-怎么可能? 第三個伙伴可以做什么來阻止我的日程安排? 我將所有指針重命名為setTimeout函數的返回值; 我嘗試在放置代碼段和/或setTimeout代碼的地方玩。 沒事

這沒有任何意義。 而且我不知道如何開始調試它。

這是一個簡化的html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My Demo</title>
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico"/>
<!--<link href="css/style.css" rel="stylesheet" type="text/css">-->
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
</head>
<body>
<script>
<!-- the alert pops up only when I remove the 3rd party snippet -->
    setTimeout(function(){      
        alert("done");
    }, 5000);   
</script>

<!-- This is the 3rd party code -->
<script type="text/javascript">
    var $P; var prefix = ('https:' == document.location.protocol ? 'https://' : 'http://'); var         _P = _P || [];
    _P.push(['setId', '123']);
    var PPP = document.createElement('script');
    PPP.type = 'text/javascript'; PPP.src = prefix +     'thethirdpartyIuse.com/functions.js';
    var s = document.getElementsByTagName('script');
    var lastScriptTag = s[s.length - 1];
    lastScriptTag.parentNode.insertBefore(PPP, lastScriptTag);
</script>
</body>
</html>

任何幫助和指導都適用!

你確定嗎? 它可以在liveweave中正常工作: http ://liveweave.com/OKMyjs而且確實應該將代碼包裝在:

 window.onload = function() {

//your stuff

}

可能是外部代碼將alert重新定義為其他內容。 若要查看是否是問題,請嘗試將代碼更改為:

(function(myalert){
  setTimeout(function(){      
      myalert("done");
  }, 5000);
})(alert);

如果這不起作用,我可以想到的唯一原因是外部腳本進入了無限循環。 在頁面中script標記的同步執行之后,一旦Javascript事件循環開始,則將執行在setTimeout注冊的函數,並且如果掛起任何頂級剝離,則可能永遠不會發生。

但是,在這種情況下,您應該看到加載將永久進行(在瀏覽器中加載動畫),並且在瀏覽足夠長時間后,瀏覽器應發出信號,表明加載頁面存在問題。

某些東西重新定義了您的alert功能。

可能的解決方案:

  • 將您的代碼包裝在(function(alert) { /* your code */ }(alert))
  • Object.defineProperty(window, 'alert', { configurable: false, enumerable: true, value: alert, writable: false }); 以保護您的alert免於重新定義。
  • 不要依賴alert (在99%的情況下,modal或console.log是更好的解決方案- alertpromptconfirm是阻止JavaScript中代碼執行的三個功能)。

經過大量調試后,我發現了問題:第三方出於某種原因(我認為是錯誤的)做了setTimeout(true) )。 在chrome中,它將取消所有計划( setTimeoutsetInterva )。

我報告了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM