我已将第三方代码整合到我的网站中,突然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>
任何帮助&amp;引导力很高!
答案 0 :(得分:0)
window.onload = function() {
//your stuff
}
答案 1 :(得分:0)
可能是外部代码将alert
重新定义为其他内容。要查看是否存在此问题,请尝试将代码更改为:
(function(myalert){
setTimeout(function(){
myalert("done");
}, 5000);
})(alert);
如果这不起作用,我能想到的唯一原因是外部脚本进入无限循环。在页面中同步执行setTimeout
标记后,Javascript事件循环开始后,将script
注册的函数执行,如果任何顶层条带挂起,则可能永远不会发生这种情况。
但是,在这种情况下,你应该看到加载是永远的(在浏览器中加载动画),经过足够长的时间,浏览器应该发出加载页面时出现问题的信号。
答案 2 :(得分:0)
重新定义了alert
功能。
可能的解决方案:
(function(alert) { /* your code */ }(alert))
Object.defineProperty(window, 'alert', { configurable: false, enumerable: true, value: alert, writable: false });
以保护您的alert
免于重新定义。alert
(在99%的情况下,模态或console.log
是优越的解决方案 - alert
,prompt
和confirm
是三个功能阻止JavaScript中的代码执行。)答案 3 :(得分:0)
经过大量调试后,我发现了问题:
由于某种原因,第三方做setTimeout(true)
(我错误地假设)。
在Chrome中,它会取消所有计划(setTimeout
&amp; setInterva
)。
我报告了这个问题。