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

JavaScript

Mandy猴子阿飞

2020-03-11

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

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

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

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

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

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

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

第807篇《为什么JavaScript仅在IE中打开开发人员工具一次后才能工作?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

8个回答
阿良 2020.03.11

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

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

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

JimLEYHarry 2020.03.11

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

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

EvaLEY 2020.03.11

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

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

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

ASamJim 2020.03.11

在我进行了较小的更改后,这解决了我的问题。我在html页面中添加了以下内容,以解决IE9问题:

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

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

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

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

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

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

有一些解决方案:

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

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

乐米亚 2020.03.11

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

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

例如:

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

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

乐猪猪 2020.03.11

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

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

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

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android