使用特征检测通过点表示法检查对保留字的支持
Using feature detection to check support for reserved words via dot notation
我正在开发一个仍然需要支持IE8的网站,我们正在尝试包含Twitter共享按钮小部件。
在IE8中,我们看到"预期标识符"错误。这似乎是一个常见的问题,下面的帖子充分而好地解释了这一点:
- Twitter小部件.js抛出JavaScript错误";期望的标识符";在IE8上
- Twitter按钮导致IE8中出现JS错误(需要标识符)
基本上,Twitter已经停止支持IE8(我希望我也能这样做;)),但更重要的是,这个错误是由于Twitter小部件.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中是"早期错误",这意味着错误会立即抛出,甚至不需要尝试执行代码。(请参见Javascript中的try-catch语句会捕获哪些类型的错误?以获得更详细的解释。)
为了解决这个问题,我们必须使用某种方式来动态创建代码,这将避免这个问题。在JavaScript中,您可以使用new Function
或eval
(在这种情况下,使用eval
是可以接受的,因为我们不是在执行用户定义的代码,并且没有真正的方法来使用它)。
测试的一个例子可能是这样的:
function testReservedWords() {
try {
new Function('a.delete');
return true;
} catch (e) {
return false;
}
}
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- 调试器;[错误]194:11:标识符是一个保留字
- 复杂Regex:如何穿't匹配//之后的保留字
- 如何使用javascript检查id字段为空的单选按钮
- 在nodejs'inspect'表现得像个保留字
- 使用特征检测通过点表示法检查对保留字的支持
- 为什么“;闭合的“;保留字是JS
- 保留字行为
- 命名函数“;删除“..删除是一个保留字
- jQuery - 检查输入字段是否保持不变
- 如何使用 for 循环来检查井字游戏中的获胜者
- 自定义 eslint 规则抛出意外的保留字
- 在带有猫鼬的 JSLint 中抑制“预期标识符,而是看到”默认“(保留字)”
- 是否可以在JS中获取保留字(变量,函数,对象名称)的列表
- 如何检查输入字段是否已填写和单选按钮是否已选中
- “parent”不应该用作javascript变量名(保留字)
- 检查输入字段是否包含某些文本
- 如何在 dialog() 模式弹出窗口中的部分视图之间保留字段数据
- 为什么我的 JavaScript 哈希带有保留字“toString”作为显示 NaN 的键
- 加密后检查空字段