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


638

IE9错误-JavaScript仅在打开开发人员工具一次后才能工作。

我们的网站为用户提供免费的pdf下载,并且具有简单的“输入密码下载”功能。但是,它在Internet Explorer中根本不起作用。

在此示例中,您可以自己看到。

下载通行证为“ makeuseof”。在任何其他浏览器中,它都可以正常工作。在IE中,两个按钮都不起作用。

我发现的最奇怪的事情是,如果使用F12打开和关闭开发人员工具栏,则所有这些突然开始工作。

我们已经尝试了兼容模式,因此没有任何区别。

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



1
如果您有构建步骤,一个不错的选择是使用gulp-strip-debug。它删除了所有console.*方法,非常适合在IE中进行生产构建或测试。
已知的2014年

15
对于未来的Google员工:我有相同的症状,但是在IE11中。好吧,事实证明答案与无关console,而是与我对获取请求的角度和缓存的使用有关。在此处此处查看答案以获取更多信息。
Christoffer Lette 2014年

@ChristofferLette是的,我有同样的问题,请检查stackoverflow.com/questions/31428126/...代码工作正常的开发工具打开时..
Pranav Bilurkar

5
这样的问题最令人讨厌的事情?它们几乎是不可能调试的,因为打开开发者控制台后它便开始工作。
jlewkovich

Answers:


815

听起来您的javascript中可能有一些调试代码。

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

console仅在打开“开发工具栏”时激活该对象。在此之前,调用控制台对象将导致其报告为undefined。打开工具栏后,控制台将存在(即使随后关闭了工具栏),因此您的控制台调用也将起作用。

有一些解决方案:

最明显的方法是遍历代码,删除对的引用console。无论如何,您都不应该在生产代码中留下类似的内容。

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


8
是否有任何解决方法可以保留调试代码?IE是唯一具有这种疯狂行为的浏览器...
Meekohi 2012年

94
if(!console) {console={}; console.log = function(){};}
Meekohi '02

79
@Meekohi if(!console)将导致相同的错误-应该阅读if(!window.console)
mindplay.dk 2012年

9
所以... IE应该没有实现每个新js开发人员一直使用的功能,以避免惹恼一些使用脚本来修复本来应该起作用的开发人员...但这是不公平的为此敲IE?你是一个非常慷慨的人Spudley !!!:)
乔丹·戴维斯

7
IE11仍会发生
迈克尔

162

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

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


8
@plus'注释中的链接不再有效。该代码已被压入一个src子目录:github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Christoffer Lette 2014年

153

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

如果未打开控制台,则IE会执行非常积极的缓存,因此请确保将任何$.ajax调用或XMLHttpRequest调用的缓存设置为false。

例如:

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

打开开发人员控制台后,缓存的积极性就会降低。似乎是一个错误(或者是一个功能?)


9
这只是救了我;)谢谢!我会说这是一个错误,因为在打开和关闭控制台的情况下,您应该具有相同的条件来测试和调试网站。
Chnoch

为我工作。具体做法是:stackoverflow.com/questions/13391563/...
user1062589

2
这应该更高,因为我认为这是实际答案。在某些IE版本中,关于console.log的可接受答案将引发错误,而不是导致此处所述的行为。
Migs

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>

1
此解决方案在Windows 7 64位版本的IE 11上不起作用。
维克拉姆

1
这解决了我在Windows 7 64位版本的IE 11上的问题。
zonyang

29

除了已console接受的答案和其他提到的“使用问题”之外,至少还有另一个原因导致有时Internet Explorer中的页面仅在激活开发人员工具的情况下才能工作。

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

这意味着,如果您的站点或页面存在缓存问题(例如,如果它缓存的缓存超过了应有的数量,例如我的情况),则在F12模式下您将不会看到该问题。因此,如果javascript执行某些缓存的AJAX请求,则它们可能无法在正常模式下按预期工作,并且在F12模式下可以正常工作。


1
有关如何禁用xmlHttpReq请求缓存的信息,请参见stackoverflow.com/questions/3984961/…
迈克尔·罗斯

1
甜。这出奇地起作用。我猜想Angular的$ http服务不会像我想的那样缓存崩溃。

17

我想这可能会有所帮助,将其添加到javascript的任何标记之前:

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

11
try catch检测变量是否存在是一个坏主意。这不仅很慢,而且如果在try块中有多个语句,则可能由于其他原因而导致异常。不要使用此功能,至少要使用它if (typeof console == 'undefined')
Juan Mendes 2014年

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!');
 }]);

你可以用

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

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


这对我有帮助,谢谢其他使用打字稿的人,这是角度定义中的“ ILogService”
DannykPowell

与使用console.log时不同,使用$ log的IIRC会导致log语句的位置被遮盖。根据我在开发过程中的经验,并不是很好。
JesseDahl

5

如果您正在使用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


4

对我来说,它发生在IE 11中。我正在调用jquery .load函数。因此,我采用了旧的方式,并在url中添加了一些内容以禁用缓存。

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

2

对于runekstodotresde提供的解决方案,我还有另一种选择,它也避免了对Spudley答案的评论中讨论的陷阱:

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

它有点sc,但是另一方面,它简洁明了,涵盖了runeks答案中涵盖的所有日志记录方法,并且它具有巨大的优势,您可以随时打开IE的控制台窗口,并且日志会流入。


0

我们在Windows 7和Windows 10的IE 11上遇到了此问题。我们通过打开IE的调试功能(IE> Internet选项>高级选项卡>浏览>取消选中禁用脚本调试(Internet Explorer))发现了问题所在。域管理员通常在我们的环境中选中此功能。

问题是因为我们console.debug(...)在JavaScript代码中使用了该方法。开发人员(我)所做的假设是,如果客户端开发人员工具控制台未显式打开,我不希望编写任何内容。尽管Chrome和Firefox似乎同意这一策略,但IE 11一点也不喜欢它。通过将所有console.debug(...)语句更改为console.log(...)语句,我们能够继续在客户端控制台中记录其他信息,并在打开时查看该信息,否则,对于一般用户而言,它是隐藏的。


0

我提出解决方案并解决了我的问题。我放入JavaScript的AJAX请求似乎没有处理,因为我的页面存在缓存问题。如果您的站点或页面存在缓存问题,则在Developers / F12模式下不会看到该问题。我的缓存JavaScript AJAX请求它​​可能无法按预期运行,并导致执行中断,F12完全没有问题。因此,只需添加新参数即可使缓存为假。

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

看起来IE特别需要将此字段设置为false,以便AJAX和javascript活动运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.