'console' is undefined error for Internet Explorer
我正在使用Firebug,并且有一些语句,比如:
1 | console.log("..."); |
在我的页面。在IE8(可能也是更早的版本)中,我得到了脚本错误,说"console"未定义。我试着把这个放在我的页面顶部:
1 2 | <script type="text/javascript"> if (!console) console = {log: function() {}}; |
但我还是有错误。有没有办法消除错误?
- 在if中使用
typeof ,可以避免未定义的错误:if(typeof console ==="undefined") { var console = { log: function (logMsg) { } }; } 。 - console.log()仅在ie的dev工具打开时才起作用(是的,ie很糟糕)。参见stackoverflow.com/questions/7742781/&hellip;
- 这个问题的最佳答案是stackoverflow.com/a/16916941/2274855
- 参见github.com/h5bp/html5-boilerplate/blob/master/js/plugins.js
- @Aprillion链接已断开,请使用以下链接:github.com/h5bp/html5样板文件/blob/master/src/js/plugins&zwnj;&8203;.js。
- 无论如何,在生产中使用控制台登录是一个坏主意,至少是一种代码味道。您可能会意外地暴露敏感的用户数据。我用声纳探测任何
console.log 声明,并强迫我在投入生产前将其移除。 if(!window.console) alert("Please use a real browser")
尝试
1 | if (!window.console) console = ... |
无法直接引用未定义的变量。但是,所有全局变量都是全局上下文同名的属性(浏览器为
或者使用
- 谢谢你,行得通。
- 为了让其他人都清楚,请将
在我的脚本中,我要么使用速记:
1window.console && console.log(...) // only log if the function exists或者,如果无法或不可行地编辑每个console.log行,我会创建一个假控制台:
1
2
3
4
5// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing.
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});- 语法错误。为什么不只是
if(!console) {console = {} ; console.log = function(){};} - 或者不只是
!window.console && (window.console = { log: function () { } }); 。
如果在IE8中打开了
Developer Tools ,则可以使用console.log() ,也可以使用"脚本"选项卡上的Console 文本框。- 如果忘记了SWEAP控制台代码,这是不好的。IE8中的错误将阻止JS代码工作
1
2
3
4
5
6
7
8if (typeof console =="undefined") {
this.console = {
log: function() {},
info: function() {},
error: function() {},
warn: function() {}
};
}- 买主警告:这应该在全球范围内定义,其中
this 指window 。
我只使用console.log输入我的代码。所以我包括一个非常短的2行
1
2var console = console || {};
console.log = console.log || function(){};- 工作原理…….I没有看到任何console.log行打印到IE浏览器,我已经测试了2个不同的系统,其中1-console.log工作,2个系统不工作。我尝试了两种方法,但在两个系统中都看不到任何日志。
根据之前的两个答案
- Vin_cius moraes
- 彼得曾
以及
- Internet Explorer(IE 10)
- 狩猎(2012)。07。23)
- 火狐(2013)。05。20)
- 铬(2013)。01。25.)和铬(2012年。10。04)
- 我的一些知识
这里是针对这个问题的一个尽最大努力的实现,这意味着如果有一个console.log实际存在,那么它将通过console.log填补不存在方法的空白。
例如,对于IE6/7,您可以将日志替换为警报(愚蠢但有效),然后包括以下怪物(我称之为console.js):[请随意删除您认为合适的评论,我将它们留作参考,最小化器可以处理它们]:
1
2
3
4
5
6<!--[if lte IE 7]>
<SCRIPT LANGUAGE="javascript">
(window.console = window.console || {}).log = function() { return window.alert.apply(window, arguments); };
<![endif]-->
<script type="text/javascript" src="console.js">和安慰。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45/**
* Protect window.console method calls, e.g. console is not defined on IE
* unless dev tools are open, and IE doesn't define console.debug
*/
(function() {
var console = (window.console = window.console || {});
var noop = function () {};
var log = console.log || noop;
var start = function(name) { return function(param) { log("Start" + name +":" + param); } };
var end = function(name) { return function(param) { log("End" + name +":" + param); } };
var methods = {
// Internet Explorer (IE 10): http://msdn.microsoft.com/en-us/library/ie/hh772169(v=vs.85).aspx#methods
// assert(test, message, optionalParams), clear(), count(countTitle), debug(message, optionalParams), dir(value, optionalParams), dirxml(value), error(message, optionalParams), group(groupTitle), groupCollapsed(groupTitle), groupEnd([groupTitle]), info(message, optionalParams), log(message, optionalParams), msIsIndependentlyComposed(oElementNode), profile(reportName), profileEnd(), time(timerName), timeEnd(timerName), trace(), warn(message, optionalParams)
//"assert","clear","count","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","msIsIndependentlyComposed","profile","profileEnd","time","timeEnd","trace","warn"
// Safari (2012. 07. 23.): https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html#//apple_ref/doc/uid/TP40007874-CH8-SW20
// assert(expression, message-object), count([title]), debug([message-object]), dir(object), dirxml(node), error(message-object), group(message-object), groupEnd(), info(message-object), log(message-object), profile([title]), profileEnd([title]), time(name), markTimeline("string"), trace(), warn(message-object)
//"assert","count","debug","dir","dirxml","error","group","groupEnd","info","log","profile","profileEnd","time","markTimeline","trace","warn"
// Firefox (2013. 05. 20.): https://developer.mozilla.org/en-US/docs/Web/API/console
// debug(obj1 [, obj2, ..., objN]), debug(msg [, subst1, ..., substN]), dir(object), error(obj1 [, obj2, ..., objN]), error(msg [, subst1, ..., substN]), group(), groupCollapsed(), groupEnd(), info(obj1 [, obj2, ..., objN]), info(msg [, subst1, ..., substN]), log(obj1 [, obj2, ..., objN]), log(msg [, subst1, ..., substN]), time(timerName), timeEnd(timerName), trace(), warn(obj1 [, obj2, ..., objN]), warn(msg [, subst1, ..., substN])
//"debug","dir","error","group","groupCollapsed","groupEnd","info","log","time","timeEnd","trace","warn"
// Chrome (2013. 01. 25.): https://developers.google.com/chrome-developer-tools/docs/console-api
// assert(expression, object), clear(), count(label), debug(object [, object, ...]), dir(object), dirxml(object), error(object [, object, ...]), group(object[, object, ...]), groupCollapsed(object[, object, ...]), groupEnd(), info(object [, object, ...]), log(object [, object, ...]), profile([label]), profileEnd(), time(label), timeEnd(label), timeStamp([label]), trace(), warn(object [, object, ...])
//"assert","clear","count","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","profile","profileEnd","time","timeEnd","timeStamp","trace","warn"
// Chrome (2012. 10. 04.): https://developers.google.com/web-toolkit/speedtracer/logging-api
// markTimeline(String)
//"markTimeline"
assert: noop, clear: noop, trace: noop, count: noop, timeStamp: noop, msIsIndependentlyComposed: noop,
debug: log, info: log, log: log, warn: log, error: log,
dir: log, dirxml: log, markTimeline: log,
group: start('group'), groupCollapsed: start('groupCollapsed'), groupEnd: end('group'),
profile: start('profile'), profileEnd: end('profile'),
time: start('time'), timeEnd: end('time')
};
for (var method in methods) {
if ( methods.hasOwnProperty(method) && !(method in console) ) { // define undefined methods as best-effort methods
console[method] = methods[method];
}
}
})();- 我不确定我们是否需要在for循环中使用
methods.hasOwnProperty(method) && 。 - 我相信你确实需要它。
- 在Chrome的控制台上做了一个快速测试:
> x = { a: 1, b: 2} ->Object {a: 1, b: 2} 和for(var f in x) {console.log(f +"" + x[f]);} 'end' ->a 1 b 2"end" 。因此,创建的匿名对象没有任何附加属性,而methods 只是在for 循环之前创建的。有没有可能破解上述内容? - 对。
var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);} 您永远不知道库对您正在处理的对象的继承链中的对象做了什么。因此,Javascript代码质量工具(如JShint和JSlint)建议使用hasOwnProperty 。
在IE9中,如果控制台未打开,则此代码:
1alert(typeof console);将显示"对象",但此代码
1alert(typeof console.log);将引发类型错误异常,但不返回未定义的值;
因此,代码的保证版本将类似于:
1
2
3
4
5
6
7try {
if (window.console && window.console.log) {
my_console_log = window.console.log;
}
} catch (e) {
my_console_log = function() {};
}- 富有洞察力的回答。
注意到OP在IE中使用Firebug,所以假设它是FirebugLite。这是一个很奇怪的情况,因为当调试器窗口打开时,控制台在IE中被定义,但是当Firebug已经运行时会发生什么?不确定,但是"firebugx.js"方法可能是在这种情况下测试的一种好方法:
来源:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
1
2
3
4
5
6
7
8
9
10if (!window.console || !console.firebug) {
var names = [
"log","debug","info","warn","error","assert",
"dir","dirxml","group","groupEnd","time","timeEnd",
"count","trace","profile","profileEnd"
];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}(更新链接12/2014)
对于IE8或仅限于console.log的console支持(无调试、跟踪等),可以执行以下操作:
如果console或console.log未定义:为创建虚拟函数控制台功能(跟踪、调试、日志…)
window.console = {
debug : function() {}, ...};否则,如果定义了console.log(ie8)并且未定义console.debug(任何其他):将所有日志功能重定向到console.log,则允许保留这些日志!
window.console = {
debug : window.console.log, ...};
不确定各种IE版本中的断言支持,但欢迎提供任何建议。在这里也发布了这个答案:我如何使用Internet Explorer中的控制台日志?
我使用的是FauxConsole;我对CSS进行了一些修改,使其看起来更好,但效果非常好。
要在IE中进行调试,请查看以下log4javascript
- 这很好,尤其是因为我的IE8控制台不输出任何内容。
- @谢谢你的评论。
- 我在找另一个问题的评论,说"无耻的自我提升",或者我不知道-类似-有人说他创造了这个科学,是你吗?我已经结账了。总之,这是一个非常好的工具,对我的项目非常有用。
- @Firsh我没有创建这个脚本,我是一个像你一样受益于使用这个工具的人。
1
2
3
4
5console = console || {
debug: function(){},
log: function(){}
...
}typescript中的控制台存根:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24if (!window.console) {
console = {
assert: () => { },
clear: () => { },
count: () => { },
debug: () => { },
dir: () => { },
dirxml: () => { },
error: () => { },
group: () => { },
groupCollapsed: () => { },
groupEnd: () => { },
info: () => { },
log: () => { },
msIsIndependentlyComposed: (e: Element) => false,
profile: () => { },
profileEnd: () => { },
select: () => { },
time: () => { },
timeEnd: () => { },
trace: () => { },
warn: () => { },
}
};有时控制台在IE8/9中可以工作,但在其他时候会失败。这种不稳定的行为取决于您是否打开了开发人员工具,并在StackOverflow问题中进行了描述IE9是否支持console.log,它是一个真正的函数吗?
在由window.open函数创建的IE9子窗口中运行console.log时遇到类似问题。
在这种情况下,控制台似乎只在父窗口中定义,在子窗口中定义,直到您刷新它们。同样适用于子窗口的子窗口。
我通过在下一个函数中包装日志来处理这个问题(下面是模块的片段)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22getConsole: function()
{
if (typeof console !== 'undefined') return console;
var searchDepthMax = 5,
searchDepth = 0,
context = window.opener;
while (!!context && searchDepth < searchDepthMax)
{
if (typeof context.console !== 'undefined') return context.console;
context = context.opener;
searchDepth++;
}
return null;
},
log: function(message){
var _console = this.getConsole();
if (!!_console) _console.log(message);
}您可以使用下面的内容来提供额外的保险,您已经投保了所有的基本险。首先使用
typeof 将避免任何undefined 错误。使用=== 还将确保类型的名称实际上是字符串"undefined"。最后,您需要在函数签名中添加一个参数(我随意选择了logMsg )以确保一致性,因为您确实要将任何要打印到控制台的内容传递给日志函数。这还可以保持IntelliSense的准确性,并避免JS感知的IDE中出现任何警告/错误。1
2
3if(!window.console || typeof console ==="undefined") {
var console = { log: function (logMsg) { } };
}在这个问题上有这么多问题之后(很难调试错误,因为如果打开开发人员控制台,错误就不会再发生!)我决定编写一个过度杀戮的代码,这样就再也不用麻烦了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38if (typeof window.console ==="undefined")
window.console = {};
if (typeof window.console.debug ==="undefined")
window.console.debug= function() {};
if (typeof window.console.log ==="undefined")
window.console.log= function() {};
if (typeof window.console.error ==="undefined")
window.console.error= function() {alert("error");};
if (typeof window.console.time ==="undefined")
window.console.time= function() {};
if (typeof window.console.trace ==="undefined")
window.console.trace= function() {};
if (typeof window.console.info ==="undefined")
window.console.info= function() {};
if (typeof window.console.timeEnd ==="undefined")
window.console.timeEnd= function() {};
if (typeof window.console.group ==="undefined")
window.console.group= function() {};
if (typeof window.console.groupEnd ==="undefined")
window.console.groupEnd= function() {};
if (typeof window.console.groupCollapsed ==="undefined")
window.console.groupCollapsed= function() {};
if (typeof window.console.dir ==="undefined")
window.console.dir= function() {};
if (typeof window.console.warn ==="undefined")
window.console.warn= function() {};个人而言,我只使用console.log和console.error,但此代码处理所有其他功能,如Mozzilla开发人员网络中所示:https://developer.mozilla.org/en-us/docs/web/api/console。只要把代码放在页面的顶部,就可以永远完成这项工作。
您可以直接在Firefox中使用console.log(…),但不能在IES中使用。在IES中,您必须使用window.console。
- console.log和window.console.log指的是任何浏览器中的相同功能,甚至与ecmascript远程一致。使用后者来避免局部变量意外隐藏全局控制台对象是一种很好的实践,但这与浏览器的选择完全无关。console.log在IE8中工作正常,而afaik在IE6/7中根本没有日志记录功能。
- 语法错误。为什么不只是