为什么JavaScript只能在IE中打开开发工具后才能工作?

IE9错误 – JavaScript只能在打开开发者工具后才能正常工作。

我们的网站为用户提供免费的pdf下载,并有一个简单的“input密码下载”function。 但是,它在Internet Explorer中完全不起作用。

在这个例子中你可以看到自己。

下载通行证是“makeuseof”。 在任何其他浏览器,它工作正常。 在IE中,两个button什么都不做。

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

我们尝试过兼容模式等等,没有什么区别。

如何在Internet Explorer中进行此项工作?

这听起来像你可能在你的JavaScript中有一些debugging代码。

您所描述的经验是典型的包含console.log()或任何其他consolefunction的代码。

console对象仅在打开“开发工具栏”时激活。 在此之前,调用控制台对象将导致它被报告为undefined 。 工具栏被打开后,控制台将会存在(即使工具栏随后被closures),所以你的控制台调用将会起作用。

有几个解决scheme:

最明显的是通过您的代码移除引用到console 。 无论如何,你不应该在生产代码中留下这样的东西。

如果你想保持控制台引用,你可以把它们包装在一个if()语句中,或者一些其他的条件,在试图调用它之前检查控制台对象是否存在。

HTML5 Boilerplate为控制台问题修复了一个很好的预编码:

 // 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; } } }()); 

正如@评论指出的,最新版本可以在他们的GitHub页面上find

另外一个可能的原因是console.log问题(至less在IE11中):

当控制台没有打开的时候,IE浏览器会进行非常积极的caching,所以确保任何$.ajax调用或者XMLHttpRequest调用都将caching设置为false。

例如:

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

当开发人员控制台处于打开状态时,caching不太积极。 似乎是一个错误(或者一个function?)

这个问题在我稍作改动之后解决了我的问题。 为了解决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 ”使用问题之外,至less有另一个原因,为什么Internet Explorer中的页面有时只与激活的开发者工具一起工作。

当开发者工具被启用时,IE并不真正使用它的HTTPcaching(至less默认在IE 11中),就像在正常模式下一样。

这意味着如果你的网站或页面有caching问题(如果caching比它应该例如 – 这是我的情况),你不会看到在F12模式下的这个问题。 所以,如果JavaScript做了一些caching的AJAX请求,他们可能无法正常工作模式,并在F12模式下正常工作。

我想这可能会有所帮助,在javascript的任何标签之前添加这个:

 try{ console }catch(e){ console={}; console.log = function(){}; } 

如果您使用的是AngularJS版本1.X,则可以直接使用$ log服务而不是直接使用console.log。

简单的日志服务。 默认实现安全地将消息写入浏览器的控制台(如果存在)。

https://docs.angularjs.org/api/ng/service/$log

所以如果你有类似的东西

 angular.module('logExample', []) .controller('LogController', ['$scope', function($scope) { console.log('Hello World!'); }]); 

你可以用它来replace它

 angular.module('logExample', []) .controller('LogController', ['$scope', '$log', function($scope, $log) { $log.log('Hello World!'); }]); 

Angular 2+ 没有任何内置的日志服务 。

它发生在IE 11中。 我正在调用jquery .load函数。 所以我做了旧时尚的方式,并在url中的东西禁用caching。

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

我为runeks和todotresde提供的解决scheme还有另外一个select,这也避免了在Spudley的回答中讨论的陷阱:

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

它有点sc but,但另一方面,它简洁,覆盖了runeks答案中涵盖的所有日志logging方法,它具有巨大的优势,您可以随时打开IE的控制台窗口,日志stream入。

如果你正在使用angular和即9, 10edge使用:

 myModule.config(['$httpProvider', function($httpProvider) { //initialize get if not there if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.get = {}; } // Answer edited to include suggestions from comments // because previous version of code introduced browser-related errors //disable IE ajax request caching $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT'; // extra $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get['Pragma'] = 'no-cache'; }]); 

要完全禁用cache

我们在Windows 7和Windows 10上的IE 11上遇到了这个问题。我们通过打开IE的debuggingfunction(IE> Internet选项>高级选项卡>浏览>取消选中禁用脚本debugging(Internet Explorer) ),发现问题到底是什么。 此function通常由域pipe理员在我们的环境中进行检查。

问题是因为我们在JavaScript代码中使用了console.debug(...)方法。 开发人员(我)所做的假设是,如果客户端开发工具控制台没有明确打开,我不想写任何东西。 尽pipeChrome和Firefox似乎认同这一策略,但IE 11并不喜欢它。 通过将所有console.debug(...)语句更改为console.log(...)语句,我们可以继续在客户端控制台中logging更多信息,并在打开时查看它,但要保持隐藏状态来自典型的用户。