Javascript 带有JS的网站不';在开发者工具激活之前,不要在IE9中工作
我正在开发一个复杂的网站,它大量利用jQuery和许多脚本。在加载站点时,我的脚本都无法工作(尽管我可以确认其他脚本运行正常)。我不会在SE上发布这样一个蹩脚的问题,除了一件事: 当我点击F12打开开发工具以便调试我的问题时,一切都立即完美地工作 更糟糕的是,如果我关闭浏览器,启动它,首先打开开发工具并访问站点,一切都会按预期进行 所以我甚至不能调试这个该死的问题,因为开发工具可以修复它!开发工具能做些什么使事情正常工作?它是否改变了UA(我执行了一些jQuery.browser检测)?它对doctype有什么作用吗 编辑 所有my console日志都包装在以下包装实用程序函数中:Javascript 带有JS的网站不';在开发者工具激活之前,不要在IE9中工作,javascript,internet-explorer-9,Javascript,Internet Explorer 9,我正在开发一个复杂的网站,它大量利用jQuery和许多脚本。在加载站点时,我的脚本都无法工作(尽管我可以确认其他脚本运行正常)。我不会在SE上发布这样一个蹩脚的问题,除了一件事: 当我点击F12打开开发工具以便调试我的问题时,一切都立即完美地工作 更糟糕的是,如果我关闭浏览器,启动它,首先打开开发工具并访问站点,一切都会按预期进行 所以我甚至不能调试这个该死的问题,因为开发工具可以修复它!开发工具能做些什么使事情正常工作?它是否改变了UA(我执行了一些jQuery.browser检测)?它对do
function log(msg){
if (console){
console.log(msg);
}
}
欢迎提出任何我可以尝试的想法或建议。如果我找到了解决方案,我会在这里发布。如果您有多个并行脚本文件,可能在打开/关闭开发工具的情况下以不同的顺序加载/执行这些文件。您有控制台调用,在IE中,如果开发工具未打开,这些调用将失败。一个简单的修复方法是将任何控制台调用封装在函数中,如:
function log(msg) {
if(console)
console.log(msg);
}
我发现简单地使用
console&&console.log('foo','bar','baz')
比使用包装函数方便得多
您提供的代码:
function logError(msg){
if (console) {
console.log(msg);
} else {
throw new Error(msg);
}
}
关闭开发工具时将为IE生成错误,因为
控制台将未定义。我使用的console.log包装器不足以检测IE9中的控制台。以下是有效的包装器:
控制台对象可用性的适当测试是:
if(typeof console==“undefined”| typeof console.log==“undefined”)
我很感激我来晚了,但我有一个IE9的解决方案,它有点不同
(function() {
var temp_log = [];
function log() {
if (console && console.log) {
for (var i = 0; i < temp_log.length; i++) {
console.log.call(window, temp_log[i]);
}
console.log.call(window, arguments);
} else {
temp_log.push(arguments);
}
}
})();
我用下面的方法破解了它
<script type="text/javascript">
(function () {
if (typeof console == "undefined") {
console = {
log : function () {}
}
}
})();
</script>
(功能(){
如果(控制台类型==“未定义”){
控制台={
日志:函数(){}
}
}
})();
这是中的第一个脚本元素。大多数其他解决方案都应该工作得很好,但是如果您不关心在控制台不可用时捕获日志消息,那么这里有一个简短的单行代码
// Stub hack to prevent errors in IE
console = window.console || { log: function() {} };
这样,您仍然可以直接使用native console.log函数,而不是每次都用任何东西包装它或使用条件函数。我已经多次遇到过这个问题。基本上,对于变量,我们这样做是为了检查它们是否有效
var somevar;
if (somevar)
//do code
这是因为somevar将解析为未定义。但如果您正在检查窗口属性,例如。窗口控制台
if (console) <---- this throws an exception
您在其他浏览器中尝试过吗?您在js中有控制台调用吗?在所有其他浏览器中都有效。还有IE8和7为什么在控制台不存在时抛出错误?这将终止IE的代码。我在logError
块中抛出一个错误,因为我只对致命错误使用它,如果开发人员因为控制台被隐藏而看不到错误,我希望停止执行。所以那部分是合法的。实际上,我将从我的示例中删除它,因为它从未被调用过(考虑到目前我的脚本中没有致命错误!)我以为我已经完成了这样一个包装器。但我会再检查一遍。很好的建议。事实上,你在钱的问题上是对的,那是一个console.log问题。然而,您的包装器在IE9中不是一个充分的检查(尽管它在IE7和IE8中一直有效)。查看我的答案。这对我有效,但我必须使用window.console
,因为console
不起作用。这个解决方案在我的情况下不起作用(IE9)。我刚刚删除了所有对控制台的调用。真有趣。我会检查一下。你上面的代码在IE9中也会失败,尽管它在IE8和IE7中也能正常工作。很好的封装解决方案+1我不敢相信我到目前为止还没有接受这个答案。谢谢大家!@Liam,为垫片准备一个nuget软件包怎么样?令人恼火的是(每次功能检测都应该获胜),这是在强制不兼容模式下降级IE9的情况下对我有效的唯一解决方案。
var somevar;
if (somevar)
//do code
if (console) <---- this throws an exception
if (window.console) <---- will NOT throw an exception if undefined
//some code
function log(msg){
if (window.console){
console.log(msg);
}
}