使用特征检测通过点表示法检查对保留字的支持

时间:2015-02-12 11:19:29

标签: javascript twitter internet-explorer-8 browser-feature-detection

我正在开发一个我们仍然需要支持IE8的网站,我们正在尝试包含Twitter共享按钮小部件。

在IE8中,我们看到了“预期标识符”错误。这似乎是一个常见的问题,如下所示的帖子可以很好地解释它:

Twitter基本上已停止支持IE8(我希望我也可以这样做;)) - 但更重要的是,错误是由于Twitter widgets.js文件似乎引用名为{{1}的属性这一事实引起的通过点符号(这就是我上面提到的第一篇SO帖子无论如何都表示)

基于上述2个SO帖子,有2个解决方法 - 要么获取widgets.js的副本,要将属性名称从delete更改为其他内容;或使用条件注释来阻止它在IE8中加载

我不喜欢widgets.js文件的副本(并且必须永远维护它!)的想法,所以我正在考虑阻止它在IE8中加载。但我不想使用条件评论;我想使用特征检测。

所以我正在尝试编写以下内容,我可以用它来决定是否调用Twitter异步库加载代码:

delete

不幸的是它不起作用,因为IE8抛出NTJSLibrary.prototype.hostSupportsDeleteKeywordAsPropertyName = function hostSupportsDeleteKeywordAsPropertyName() { var testObj = {"delete":true}; try { return testObj.delete; } catch (e) { // Host does not support referencing a property named 'delete' and has thrown an exception return false; } }; 错误,这是一个编译/解释错误,而不是运行时错误。 IE不会抛出异常,因为它不会运行!

有没有人知道如何编写一个特征检测函数来检测是否通过点表示法引用保留字SCRIPT1010会导致编译/解释错误?

1 个答案:

答案 0 :(得分:1)

您不能仅使用try-catch语句对其进行测试的原因是语法错误是JavaScript中的“早期错误”,这意味着即使在尝试执行代码时也会立即抛出错误。 (看到 What types of errors are caught by try-catch statements in Javascript?有更详细的解释。)

要解决此问题,我们必须使用某种方式动态创建代码,这将避免此问题。在JavaScript中,您可以使用new Functioneval执行此操作(在这种情况下,使用eval是可以接受的,因为我们没有执行用户定义的代码,并且没有真正的方法可以使用它)。

测试的一个例子可能是这样的:

function testReservedWords() {
  try {
    new Function('a.delete');
    return true;
  } catch (e) {
    return false;
  }
}