提问人:Randy 提问时间:12/5/2020 更新时间:12/5/2020 访问量:124
javascript 中是否有一种简单的方法可以测试 IE8 中的“null or not an object”错误
Is there a simple way in javascript to test for "null or not an object" error in IE8
问:
很长一段时间以来,我一直信任许多代码示例,这些示例显示了据称允许“安全”检测不可用的对象或对象属性。两个简单的例子包括像这样获取屏幕的可用宽度/高度......
var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
或者也许是为了确保服务或程序可用,以便我可以采取替代措施,例如......
if (!window.event) // do something else
if (!window.XMLHttpRequest) // do something else
我没有编造上述任何测试,而是从 stackoverflow 上的答案中获取它们,通常来自高评分的答案。然而,当我在 IE8 上运行带有构造的代码时,脚本将停止,调试器将吐出错误,例如......
'window.event' is null or not an object
'window.XMLHttpRequest' is null or not an object
'window.innerWidth' is null or not an object
当然,它们不是“警告”。它们是阻止一切的错误。所以我想没有简单的方法来测试IE8中的这些类型的对象或对象属性?我想我可以在可能导致“null 或不是对象”投诉的每一行代码周围放置 try/catch 块,但它肯定会使我的库变得更大,而且可能会更慢!像这样的条件编译结构似乎效果不佳......
<!--[if gte IE 9 | !IE ]>-->
// do something only if !IE or IE > 8
<!--<![endif]>-->
// resume normal inclusion? usually not reliably!
因此,在我给出的导致错误的示例中,我该怎么做才能使代码对于不支持对象的浏览器更安全,仅使用普通的 javascript?
答:
1赞
maxxioso
12/5/2020
#1
好吧,由于对 “in” 运算符的支持一直延伸到 IE 5.5(至少根据这篇 MDN 参考文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in),你可以尝试这样的事情:
if ('event' in window || 'innerWidth' in window || 'XMLHttpRequest' in window) {
// Do stuff...
}
评论
0赞
Randy
12/5/2020
谢谢!我将尝试一下并运行一些测试。为了理智起见,除非这是一个非常简单的问题,否则我不会尝试支持低于 IE8 的支持。但事实上,像“if (window.event)”这样广泛使用的东西正在失败,我怀疑在我的代码中的某个地方我不小心破坏了整个“window”对象。我以前做过,只是愚蠢地认为我可以创建一个名为“window”的本地 var 哈哈!
0赞
Randy
12/5/2020
是的!这确实有效,而且绝对似乎是一种安全的测试方式,并且必须比任何 try/catch 块都快得多!再次感谢!
评论