繁体   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