Javascript:由于第三方,我的setTimeout功能无法正常工作

时间:2014-12-12 11:26:39

标签: javascript html

我已将第三方代码整合到我的网站中,突然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;引导力很高!

4 个答案:

答案 0 :(得分:0)

你确定吗?它在liveweave中工作正常:http://liveweave.com/OKMyjs 事实上,你应该将代码包装在:

 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是优越的解决方案 - alertpromptconfirm是三个功能阻止JavaScript中的代码执行。)

答案 3 :(得分:0)

经过大量调试后,我发现了问题: 由于某种原因,第三方做setTimeout(true)(我错误地假设)。 在Chrome中,它会取消所有计划(setTimeout&amp; setInterva)。

我报告了这个问题。