javascript - 为什么IE 的Javascript仅在打开开发人员工具时工作?

  显示原文与译文双语对照的内容

IE9 Bug - 只有在打开开发者工具之后,Javascript才会工作。

我们的网站提供免费的pdf下载给用户,并且它有一个简单的"输入要下载的密码"功能。 但是,它在 IE 中根本不起作用。

你可以在下面的示例中看到: http://www.makeuseof.com/pages/how-to-use-virtual-box

下载通过是"makeuseof"。 在其他浏览器中,它可以正常工作。 在 IE 中,按钮都不做任何事情。

我发现最奇怪的事情是,如果你用F12打开和关闭开发者工具栏,它就会突然开始工作。

我们已经尝试了兼容模式,但没有什么区别。 请帮我弄清楚这个 !

如何在 IE 中进行这项工作?

时间:

似乎你的javascript中有一些调试代码。

你所描述的经验是典型的包含 console.log() 或者其他 console 功能的代码。

console 对象仅在开发工具栏打开时激活。 在这之前,调用控制台对象将导致它被报告为 undefined 。 打开工具栏之后,控制台将存在( 即使工具栏随后关闭),这样你的控制台调用就会工作。

对此有一些解决方案:

最明显的一个是通过代码删除对 console的引用。 你不应该在生产代码中留下这样的东西。

如果你想要保留控制台引用,你可以将它们包装在 if() 语句中,或者在其他条件下,检查控制台对象是否存在,然后再调用它。

HTML5 Boilerplate 为解决控制台问题提供了一个不错的pre-made代码:


//Avoid `console` errors in browsers that lack a console.
(function() {
 var method;
 var noop = function () {};
 var methods = [
 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
 'timeStamp', 'trace', 'warn'
 ];
 var length = methods.length;
 var console = (window.console = window.console || {});

 while (length--) {
 method = methods[length];

//Only stub undefined methods.
 if (!console[method]) {
 console[method] = noop;
 }
 }
}());

就像 @plus- 在评论中指出的,最新版本在 GitHub页面中可用

这解决了我对它稍作改动后的问题。 为了解决IE9问题,我在我的html页面中添加了以下内容:


<script type="text/javascript">
//IE9 fix
 if(!window.console) {
 var console = {
 log : function(){},
 warn : function(){},
 error : function(){},
 time : function(){},
 timeEnd : function(){}
 }
 }
</script>

除了 console.log 问题( 至少在IE11中) 之外,还有另一个可能的原因:

当控制台没有打开时,IE 做了相当积极的缓存,所以确保任何 $.ajax 调用或者 XMLHttpRequest 调用都设置为假。

例如:


$.ajax({cache: false,.. .})

当开发者控制台处于打开状态时,缓存就不那么激进了。 似乎是一个 Bug ( 或者也许是一个特性)?

除了接受的答案和其他的'console'用法问题之外,至少还有一个原因是 IE 中的页面只与开发者工具一起使用。

当开发者工具启用时,IE 并没有像在普通模式下那样使用它的HTTP缓存( 至少在 IE 11中默认) 。

这意味着如果你的站点或者页面有缓存问题( 如果它缓存的超过了它应该做的例如- 那就是我的例子),你将不会在F12模式下看到那个问题。 因此,如果javascript执行一些缓存的AJAX请求,它们可能无法按照正常模式正常工作,并且在F12模式下工作正常。

我有另一个替代的解决方案提供的runekstodotresde,还避免了缺陷在评论中讨论 Spudley回答的:


 try {
 console.log(message);
 } catch (e) {
 }

有点破旧,但另一方面它是简洁的,覆盖所有日志方法覆盖 runeks回答,它有巨大的优势,你可以打开控制台窗口随时 IE 和日志流入。

它发生在 IE 11中为我。 我在调用 jquery. load 函数。 所以我用旧的方式做了,把一些东西放到了url中,禁用 cacheing 。


$("#divToReplaceHtml").load('@Url.Action("Action","Controller")/' + @Model.ID +"?nocache=" + new Date().getTime());

...