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

Jam*_*uce 633 javascript internet-explorer internet-explorer-9

IE9 Bug - 只有在打开一次开发人员工具后才能使用JavaScript.

我们的网站为用户提供免费的pdf下载,它有一个简单的"输入密码下载"功能.但是,它在Internet Explorer中根本不起作用.

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

下载通行证是"makeuseof".在任何其他浏览器中,它工作正常.在IE中,两个按钮都不起作用.

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

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

如何在Internet Explorer中完成此工作?

Spu*_*ley 809

听起来你的javascript中可能有一些调试代码.

您描述的体验是典型的包含console.log()或任何其他console功能的代码.

console只有在打开开发工具栏时才会激活该对象.在此之前,调用控制台对象将导致报告为undefined.打开工具栏后,控制台将存在(即使工具栏随后关闭),因此您的控制台调用将起作用.

有一些解决方案:

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

如果要保留控制台引用,可以将它们包装在if()语句中,或者在尝试调用之前检查控制台对象是否存在的其他条件.

  • `if(!console){console = {}; console.log = function(){};}` (94认同)
  • @Meekohi`if(!console)`会导致同样的错误 - 它应该是`if(!window.console)` (79认同)
  • 所以... IE应该没有实现每个新的js开发人员一直使用的功能,以避免烦扰一些使用脚本修复应该首先工作的东西的开发人员......但这是不公平的为此敲IE?你是一个非常慷慨的人斯普利!:) (9认同)
  • 是否有任何解决方法可以保留调试代码?IE是唯一具有这种无聊行为的浏览器...... (8认同)
  • IE11仍然会发生 (6认同)
  • `if(!window.console){console = {}; console.log = function(){};}"我的上帝,这只是修复了这个烦人的问题,当用户直接打开我的网站作为起始网站时,我的代码不能用于IE8和9.似乎在IE10和11上这不再是一个问题了. (3认同)
  • @jorjordandan - 好吧,你不能真正为此敲打旧的 IE;如果您尝试使用旧版本的 Firefox 进行调试,也会遇到同样的问题。只是没有人再使用 Firefox 3。 (2认同)
  • 通过搜索从谷歌来到这里:“打开开发工具f12时,即问题消失”这解决了我无法在我拥有的任何版本的IE上重现的问题,但该问题在客户端突然出现。调试也是不可能的,因为打开开发工具来找出发生的情况会导致问题消失。非常感谢; 我希望我能把这个提高不止一个。 (2认同)

Tal*_*ris 161

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;
        }
    }
}());
Run Code Online (Sandbox Code Playgroud)

正如@ plus-在评论中指出的那样,最新版本可以在他们的GitHub页面找到

  • @plus'评论中的链接不再有效.代码已被推送到`src`子目录:https://github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js (8认同)

小智 153

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

当控制台未打开时,IE会进行相当激进的缓存,因此请确保所有$.ajax调用或XMLHttpRequest调用都将缓存设置为false.

例如:

$.ajax({cache: false, ...})
Run Code Online (Sandbox Code Playgroud)

当开发人员控制台打开时,缓存不那么激进.似乎是一个错误(或者可能是一个功能?)

  • 这只是救了我;)谢谢!我说这是一个错误,因为你应该有相同的条件来测试和调试你的网站控制台打开和关闭. (9认同)
  • 这应该更高,因为我认为是实际的答案...在某些IE版本中关于console.log的接受答案将引发错误,不会导致此处描述的行为. (2认同)

小智 63

在我对它做了一些小改动后,这解决了我的问题.我在我的html页面中添加了以下内容以修复IE9问题:

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

  • 此解决方案不适用于 Windows 7 64 位上的 IE 11。 (2认同)
  • 这解决了我在 Windows 7 64 位上的 IE 11 上的问题。 (2认同)

Sim*_*ier 29

除了console在已接受的答案和其他人中提到的"使用问题"之外,至少还有另一个原因,即Internet Explorer中的页面有时仅与激活的开发人员工具一起工作.

启用开发人员工具时,IE并不像在正常模式下那样真正使用其HTTP缓存(至少在IE 11中默认使用).

这意味着如果您的站点或页面存在缓存问题(例如,如果缓存超出应该的范围 - 这是我的情况),您将不会在F12模式下看到该问题.因此,如果javascript执行一些缓存的AJAX请求,它们可能无法在正常模式下按预期工作,并在F12模式下正常工作.

  • 甜的。这令人惊讶地奏效了。我猜 Angular 的 $http 服务并没有像我想象的那样缓存。 (3认同)
  • 有关如何禁用缓存 xmlHttpReq 请求的信息,请参阅 http://stackoverflow.com/questions/3984961/prevent-xmlhttpreq-s-browser-caching。 (2认同)

tod*_*sde 17

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

try{
  console
}catch(e){
   console={}; console.log = function(){};
}
Run Code Online (Sandbox Code Playgroud)

  • `try catch`来检测变量是否存在是一个坏主意.它不仅速度慢,而且如果你的try块中有多个语句,你可能会因为其他原因而获得异常.不要使用它,至少使用`if(typeof console =='undefined')` (11认同)

Osk*_* S. 8

如果您使用的是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!');
 }]);
Run Code Online (Sandbox Code Playgroud)

你可以用它替换它

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

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


小智 5

我在 IE 11 中就遇到了这种情况。我正在调用 jquery .load 函数。所以我用旧的方式做了,并在 url 中添加一些内容来禁用缓存。

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


Its*_*has 5

如果您正在使用angular和ie 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';
}]);
Run Code Online (Sandbox Code Playgroud)

完全禁用cache.