【发布时间】:2012-04-09 22:52:30
【问题描述】:
我最近在读取和比较某些[[Class]] 属性的值时遇到了一些问题(我目前还不知道 9)。实际上,它仅适用于 localStorage 对象。
我正在使用这样的方法
var ToStr = Object.prototype.toString;
Object.type = function _type( obj ) {
var res = ToStr.call( obj ).split( ' ' )[ 1 ].replace( ']', '' );
if( obj === window ) {
res = 'Window';
}
else if( res === 'Window' || res === 'Global' ) {
res = 'Undefined';
}
else if( res.indexOf( 'HTML' ) === 0 ) {
res = 'Node';
}
return ( res );
};
此方法将返回此值,例如:
var foo = { },
bar = [ ],
num = 52,
win = window;
Object.type( foo ) === 'Object'; // true
Object.type( bar ) === 'Array'; // true
Object.type( num ) === 'Number'; // true
Object.type( win ) === 'Window'; // true
这当然有效,在我知道的所有浏览器中,只需检查对象本身的 [[Class]] 属性即可。现在,我在 localStorage 对象上调用此方法
Object.type( win.localStorage ) === 'Storage' // true (not in IE8)
IE8 在这里只返回Object。但是,这不是实际问题,当您尝试将localStorage 对象与window 对象进行比较时,就会出现问题。如您所见,我正在检查传入的参数是否是当前的window 对象
if( obj === window ) { }
如果 obj 现在是 window.localStorage 对象,这将导致错误
"Class does not support automation"
只有当您尝试将localStorage 与window 进行比较时才会发生这种情况,您可以将它与其他任何东西进行比较而不会遇到任何问题。这只是另一个错误还是我可以以某种方式解决这个问题?
我想基本上我的问题是:
您如何知道在 IE8(也可能是 IE9)中处理的是localStorage 对象?
我要做的最后一件事是用try-catch 对整个方法进行内部包装,因为它经常被调用。
这里完全让我感到困惑:当你在 IE8 的控制台中执行 console.log( obj ) 时,它会返回 [object Storage](很好!)但如果你调用 Object.prototype.toString.call( obj ),它会返回 [object Object]。 typeof obj 也是如此,将返回 object。
第二个问题:
IE8的console如何打印出正确的[[Class]]?
【问题讨论】:
-
仅供参考:我检查过,IE9 可以正常工作,并且没有显示任何问题。
-
只是基于我记忆中一些随机事物的疯狂猜测:如果您针对
window.window而不是仅window进行测试有什么不同吗? (或者可能是window.self?) -
@Pointy:刚刚试过,在 IE8 中出现同样的错误(如果这样我会永远 ragequit IE)
-
好的。好吧,我刚刚回忆起某些版本的 IE 中的
window引用与window.window不同。您可以动态地创建函数并在创建它的函数中进行测试,而不是总是在try ... catch中编码,从而得到一个带有try ... catch的 IE8 版本,否则是一个普通版本。 -
@Pointy:是的,我可以做到。反正我不喜欢。如果它是
localStorage对象,我仍然希望有一些神奇的属性或任何可以在代码中告诉你的东西。console可以做到...
标签: javascript dom browser internet-explorer-8 local-storage