我正在开发一个复杂的网站,它充分利用了jQuery和许多脚本。在加载网站时,我的脚本都没有工作(虽然我可以确认其他脚本运行正常)。除了一件事,我不会在SE上发布这样一个蹩脚的问题:
我点击F12打开开发人员工具,以便我可以调试我的问题,一切都能立即完美!
更糟糕的是,如果我关闭浏览器,启动它,首先打开Dev Tools并访问该网站,一切都按预期工作。
所以我甚至无法调试这个问题,因为Dev Tools修复了它! Dev Tools可以做些什么让事情发挥作用?它是否改变了UA(我做了一些jQuery.browser检测)?它对doctype有用吗?
修改
我的所有控制台日志记录都包含在以下包装器实用程序函数中:
function log(msg){
if (console){
console.log(msg);
}
}
我可以尝试任何想法或建议。如果我找到解决方案,我会在这里发帖。
答案 0 :(得分:34)
我很欣赏我在这里参加聚会的时间已经很晚了,但是我已经找到了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);
}
}
})();
基本上不是console.log
而是使用log
。如果存在console.log
,则它会正常工作,否则它会将日志条目存储在数组中,并在log
可用的console
下输出。
如果在console
可用时立即推送数据会很好,但这比设置自定义setInterval侦听器要便宜。
我已更新此脚本供我自己使用,并认为我会分享它。它有一些有价值的改进:
console.log()
,即不再需要使用非标准log()
console.log('foo', 'bar')
console.error
,console.warn
和console.info
(虽然将其输出为console.log
)console
并在找到时输出缓冲区我认为通过这些改进,这已成为IE9的一个非常可靠的垫片。的 Check out the GitHub repo here 强>
if (!window.console) (function() {
var __console, Console;
Console = function() {
var check = setInterval(function() {
var f;
if (window.console && console.log && !console.__buffer) {
clearInterval(check);
f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log;
for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]);
}
}, 1000);
function log() {
this.__buffer.push(arguments);
}
this.log = log;
this.error = log;
this.warn = log;
this.info = log;
this.__buffer = [];
};
__console = window.console = new Console();
})();
答案 1 :(得分:13)
您有控制台调用,在IE中,如果开发工具未打开,这些调用将失败。一个简单的解决方法是在以下函数中包装任何控制台调用:
function log(msg) {
if(console)
console.log(msg);
}
答案 2 :(得分:2)
我已经通过以下方式破解了它
<script type="text/javascript">
(function () {
if (typeof console == "undefined") {
console = {
log : function () {}
}
}
})();
</script>
这是。
中的第一个脚本元素答案 3 :(得分:2)
其他大多数解决方案都应该运行得很好,但是如果你不关心在控制台不可用时捕获日志消息的话,这里只有一个短的内容。
// Stub hack to prevent errors in IE
console = window.console || { log: function() {} };
这使您仍然可以直接使用本机console.log函数,而不是每次都包装它或有条件。
答案 4 :(得分:1)
我发现简单地使用console && console.log('foo', 'bar', 'baz')
而不是使用包装函数会更方便。
您提供的代码:
function logError(msg){
if (console) {
console.log(msg);
} else {
throw new Error(msg);
}
}
当关闭开发工具时,IE会产生错误,因为console
将是未定义的。
答案 5 :(得分:1)
我使用的console.log包装器不足以检测IE9中的控制台。这是包含from a related question on SE的包装器:
function logError(msg){
try {
console.log(msg);
} catch (error) {
throw new Error(msg);
}
}
function log(msg){
try {
console.log(msg);
} catch (error) { }
}
对控制台对象可用性的正确测试将是:
if (typeof console === "undefined" || typeof console.log === "undefined")
答案 6 :(得分:0)
如果您有多个并行脚本文件,可能是开/关开发工具以不同顺序加载/执行文件。
答案 7 :(得分:0)
我多次遇到过这个问题。基本上使用变量我们这样做是为了检查它们是否有效
var somevar;
if (somevar)
//do code
这是有效的,因为somevar将解析为undefined。但是,如果你检查一个窗口属性,例如。 window.console。
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);
}
}