![](/img/trans.png)
[英]How to “import” a 3rd party javascript module to my react project?
[英]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
是更好的解決方案- alert
, prompt
和confirm
是阻止JavaScript中代碼執行的三個功能)。 經過大量調試后,我發現了問題:第三方出於某種原因(我認為是錯誤的)做了setTimeout(true)
)。 在chrome中,它將取消所有計划( setTimeout
和setInterva
)。
我報告了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.