javascript脚本无法正常工作并崩溃IE

@Eelix Kling在这篇文章中提供了这个脚本,但是当我使用它时崩溃我的IE; 在FF 3.6上,Opera,Chrome,Safari工作正常。

知道为什么会这样吗? 修复可能吗?

var ajaxTimeout; function autorun() { if ($("#contactForm").is(":visible")){ if(ajaxTimeout) { clearInterval(ajaxTimeout); ajaxTimeout = false; } } else if(!ajaxTimeout) { ajaxTimeout = setInterval("refreshAjax();", 15000); } } $(function autorun() { setInterval("autorun();", 2000) }); 

谢谢,

克里斯蒂安。

LE。 对不起,忘了添加相关细节。

IE只是关闭,“遇到错误,需要关闭,寻找解决方案……”。 IE 8.0 Windows7。 如果我加载页面,我无法从开发人员工具打开调试器,但是如果我在加载该页面之前打开调试器并按启动调试它没有显示任何错误或任何内容,但页面没有刷新网格这是假设的。

这就是你所追求的:

 $(function () { var ajaxTimeout; function autorun() { if ($("#contactForm").is(":visible")){ if(ajaxTimeout) { clearInterval(ajaxTimeout); ajaxTimeout = false; } } else if(!ajaxTimeout) { ajaxTimeout = setInterval(refreshAjax, 15000); } } setInterval(autorun, 2000); }); 

IE完全不像这样使用的命名函数,它覆盖了之前定义的函数。 这是一个长期存在的错误, 直到IE9才解决 。 问题的核心是$(function autorun() {正在接管autorun名称,它只是排队越来越多的自身运行。

另外,最好直接将函数引用传递给setInterval() ,而不是字符串。

我怀疑这是罪魁祸首:

 $(function autorun() { setInterval("autorun();", 2000) }); 

这不是真正有效的JavaScript。 我想它可能应该是这样的:

 $(document).ready(function() { setInterval("autorun();", 2000); }); 

[编辑:上面的建议有误,我已经纠正了。 我错误地将setInterval(...)的结果分配给变量ajaxTimeout 。 这最终导致主autorun()函数内部的逻辑永远不会在refreshAjax()上启动它的间隔,从而导致代码看起来“什么都不做”。


[编辑:有些人表示我的建议没有得到足够的解释,所以我会尝试在这里提供。]

  • 你两次声明function autorun() 。 一旦在顶部,再次在底部,我建议你应该做出改变。 两个声明都在相同的范围内,因此名称将发生冲突,行为将依赖于浏览器。 有些浏览器会让一个函数“隐藏”另一个,而其他浏览器会(可能)拒绝编译它。

  • 您已在“内联”上下文中使用了命名函数声明(自动运行的第二个声明)。 某些浏览器可能允许这样做(有些人认为它实际上是有效的标准 – 尽管我认为不是这样),但它肯定会在IE中引起问题。

  • 我的建议是将第二个声明更改为匿名声明,以便一举两得:避免名称冲突,并使用所有浏览器都支持的语法。

  • 最后,我介绍了$(document).ready(...) ,因为这些日子是用jQuery编程时的标准做法。 您可以在jQuery的网站上阅读更多相关信息。 长话短说 – 它直接等同于您使用的$(function() {...})语法,因此您可以随意使用或保留它。