javascript - 使用功能检测通过点表示法检查对保留字的支持

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

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

在 IE8 中,我们看到“预期标识符”错误。这似乎是一个常见问题,下面的帖子对此进行了充分而良好的解释:

基本上 Twitter 已经停止支持 IE8(我希望我也能这样做 ;) ) - 但更重要的是,该错误是由于 Twitter widgets.js 文件似乎引用了名为 delete 的属性而引起的 通过点表示法(这就是我上面引用的第一篇 SO 帖子所建议的)

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

我不喜欢复制 widgets.js 文件(并且必须永远维护它!),因此我正在考虑阻止它在 IE8 中加载。但我不想使用条件注释;我想使用特征检测。

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

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;
    }
};

不幸的是,它不起作用,因为 IE8 抛出 SCRIPT1010 错误,这是一个编译/解释错误,而不是运行时错误。 IE 不会抛出异常,因为它没有运行!

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

最佳答案

之所以不能只用 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;
  }
}

关于javascript - 使用功能检测通过点表示法检查对保留字的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28476131/

相关文章:

javascript - jquery - 问题检查/样式单选按钮用 anchor 包裹它

mysql - Redis 排序 : How do I sort a redis hash key by given value?

jquery - 使用 LESS 变量的 IE8 REM 回退

css - 我如何使用过滤器 : for ie8 that won't affect ie9?

javascript - 使用 $.get 调用文件时 socket.io 事件不起作用

javascript - 原子索引错误与从视频 currentTime 派生的 searchElement

facebook - 创建在社交网络上分享时每天更新的网页图像(如屏幕截图)

css - 在 IE8 中水平居中 div

javascript - 实现通用的实时协作编辑器/插件(如 Google Docs)

java - 无法使用 Selenium Webdriver 在 Twitter 上撰写新推文框中输入文本