Why does JavaScript only work after opening developer tools in IE once?
IE9 Bug - 只有在打开一次开发人员工具后才能使用JavaScript。
我们的网站为用户提供免费的pdf下载,它有一个简单的"输入密码下载"功能。 但是,它在Internet Explorer中根本不起作用。
你可以在这个例子中看到自己。
下载通行证是"makeuseof"。 在任何其他浏览器中,它工作正常。 在IE中,两个按钮都不起作用。
我发现最奇怪的事情是,如果用F12打开和关闭开发人员工具栏,它就会突然开始工作。
我们尝试过兼容模式等等,没有什么区别。
如何在Internet Explorer中完成此工作?
听起来你的javascript中可能有一些调试代码。
您所描述的体验是典型的包含
只有在打开开发工具栏时才会激活
有一些解决方案:
最明显的一个是通过代码删除对
如果要保留控制台引用,可以将它们包装在
HTML5 Boilerplate有一个很好的预制代码,用于修复控制台问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 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页面上找到
除了
当控制台未打开时,IE会进行相当激进的缓存,因此请确保所有
例如:
1 | $.ajax({cache: false, ...}) |
当开发人员控制台打开时,缓存不那么激进。似乎是一个错误(或者可能是一个功能?)
在我对它做了一些小改动后,这解决了我的问题。我在我的html页面中添加了以下内容以修复IE9问题:
1 2 3 4 5 6 7 8 9 10 11 | <script type="text/javascript"> // IE9 fix if(!window.console) { var console = { log : function(){}, warn : function(){}, error : function(){}, time : function(){}, timeEnd : function(){} } } |
除了在已接受的答案和其他人中提到的'
启用开发人员工具时,IE并不像在正常模式下那样真正使用其HTTP缓存(至少在IE 11中默认使用)。
这意味着如果您的站点或页面存在缓存问题(例如,如果缓存超出应该的范围 - 这就是我的情况),那么在F12模式下您将看不到该问题。因此,如果javascript执行一些缓存的AJAX请求,它们可能无法在正常模式下按预期工作,并在F12模式下正常工作。
我想这可能有所帮助,在任何javascript标签之前添加这个:
1 2 3 4 5 | try{ console }catch(e){ console={}; console.log = function(){}; } |
如果您使用的是AngularJS版本1.X,则可以使用$ log服务而不是直接使用console.log。
Simple service for logging. Default implementation safely writes the message into the browser's console (if present).
https://docs.angularjs.org/api/ng/service/$log
所以,如果你有类似的东西
1 2 3 4 | angular.module('logExample', []) .controller('LogController', ['$scope', function($scope) { console.log('Hello World!'); }]); |
你可以用它替换它
1 2 3 4 | angular.module('logExample', []) .controller('LogController', ['$scope', '$log', function($scope, $log) { $log.log('Hello World!'); }]); |
Angular 2+没有任何内置日志服务。
如果您使用的是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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'; }]); |
要完全禁用
它发生在IE 11中。我正在调用jquery .load函数。
所以我用旧的时尚方式做了,并在URL中放了一些东西来禁用缓存。
1 | $("#divToReplaceHtml").load('@Url.Action("Action","Controller")/' + @Model.ID +"?nocache=" + new Date().getTime()); |
我为runeks和todotresde提供的解决方案提供了另一种选择,这也避免了对Spudley答案的评论中讨论的陷阱:
1 2 3 4 | try { console.log(message); } catch (e) { } |
它有点邋but但另一方面它简洁并涵盖了runeks答案中涵盖的所有日志记录方法,它具有巨大的优势,您可以随时打开IE的控制台窗口并且日志流入。
我提出决议并解决我的问题。看起来我放入JavaScript的AJAX请求没有处理,因为我的页面有一些缓存问题。如果您的网站或网页有缓存问题,您将无法在开发人员/ F12模式中看到该问题。我缓存的JavaScript AJAX请求它??可能无法正常工作并导致执行中断哪个F12完全没有问题。
所以只需添加新参数以使缓存为false。
1 2 3 | $.ajax({ cache: false, }); |
看起来IE特别需要这个是假的,以便AJAX和javascript活动运行良好。
我们在Windows 7和Windows 10上的IE 11上遇到了这个问题。通过打开IE的调试功能(IE> Internet选项>高级选项卡>浏览>取消选中禁用脚本调试(Internet Explorer)),我们发现了问题究竟是什么。通常由域管理员在我们的环境中检查此功能。
问题是因为我们在JavaScript代码中使用了