1

我有一些无法更改的旧 JavaScript 代码在 IE10 上崩溃(我可以更改其他脚本文件)。

这是崩溃的代码:

if(isInternetExplorer && this.domElement.filters[0])
  this.domElement.filters[0].play()

该代码不会在 ie8/9 中崩溃,因为 DOM 元素具有非标准属性“过滤器”。

这是filters 属性的文档。

我能想到的唯一解决方案是更改 HtmlElement 的原型,但我不觉得这实际上是可能的或做的好事。

那么如何防止 IE10 在尝试使用 DomObject.filters 属性时崩溃呢?

[编辑] 我刚刚找到了一个“解决方案”。这也是@JAM 的解决方案。

if (!HTMLDivElement.filters) {
    HTMLDivElement.prototype.filters = [];
}

但是我仍然对修改浏览器原生对象的原型感到难过。

4

2 回答 2

1

正如您所说,覆盖对象的原型是一种方法;所以如果没有其他选择,你可以试试这个:

Object.prototype.filters = Object.prototype.filters || []

甚至更好(正如你自己建议的那样):

HTMLDivElement.prototype.filters = HTMLDivElement.prototype.filters || []

如果对象不存在,这将设置对象的过滤器属性。

于 2013-05-14T20:39:21.897 回答
1

嗯,使用特征检测而不是浏览器检测?请不要isInternetExplorer,但是doesSupportFilters

var el = this.domElement;
if (el.filters && el.filters.length && typeof el.filters[0].play == "function")
    el.filters[0].play();
于 2013-05-14T22:11:32.370 回答