IE9 Bug - JavaScript只能在打开一次开发工具后才能工作。

我们的网站为用户提供免费的pdf下载,它有一个简单的“输入密码下载”功能。但是,它在ie浏览器中完全不起作用。

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

下载通道是“makeuseof”。在任何其他浏览器中,它都可以正常工作。在IE中,两个按钮什么都不做。

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

我们已经尝试了兼容模式等,没有什么不同。

我如何使这工作在Internet Explorer?


当前回答

听起来好像你的javascript中有一些调试代码。

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

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

这里有一些解决方案:

最明显的方法是在代码中删除对控制台的引用。无论如何,您都不应该在产品代码中留下这样的东西。

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

其他回答

如果你使用的是angular和ie 9,10或edge:

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

完全禁用缓存。

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

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

https://docs.angularjs.org/api/ng/service/美元日志

如果你有类似的东西

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+没有任何内置的日志服务。

这解决了我的问题后,我做了一个小的改变。为了解决IE9的问题,我在我的html页面中添加了以下内容:

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

对我来说,这发生在IE 11中。我在调用jquery。load函数。 所以我用了老方法,在url中放了一些东西来禁用缓存。

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

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

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