![](/img/trans.png)
[英]SCRIPT438: Object doesn't support property or method 'filter' IE10
[英]“Object doesn't support this property or method” IE10/11
随着ES6的普及,我渴望放弃jQuery并使用本机JS来构建网站,从而使它们既快速又轻便。 我也提高了JS技能,因为我是直接使用jQuery的人之一。
我正在构建一个微小的微型库,以使函数中更常用的javascript保持较小的文件。
function $(elm) {
var elm = document.querySelectorAll(elm);
this.forEach = function(f) {
[].forEach.call(elm, f);
}
return elm;
}
function slider() {
$(".slider").forEach(function() {
alert("Hello");
});
}
slider();
这在Chrome等系统中效果很好。但是在IE10 / 11中,我遇到了错误
对象不支持此属性或方法“ forEach”
引用$(“。slider”)。forEach
有任何想法吗?
您将forEach
添加到window
对象,而不是返回的对象; 您将$
称为函数而不是构造函数。 由于您使用的是宽松模式(显然), this
在函数调用中, this
是对全局对象的引用(也可以在浏览器中作为window
访问)。 您将从querySelectorAll
返回的集合保持不变。
它在Chrome上运行的原因是querySelectorAll
返回的集合具有自己的forEach
(这是最近添加的)。
为此,有四个选项:
返回一个对象并向其添加forEach
,将元素从QSA集合复制到该对象。 例如:
function $(selector) { const result = Array.from(document.querySelectorAll(selector)); result.forEach = Array.prototype.forEach; // Perhaps map, filter, etc.; add in a loop? return result; }
或在ES5中:
var $ = (function() { var methods = Array.prototype; function $(selector) { var result = methods.slice.call(document.querySelectorAll(selector)); result.forEach = methods.forEach; // Perhaps map, filter, etc.; add in a loop? return result; } return $; })();
将forEach
添加到NodeList
原型(如果尚不存在),并直接在querySelectorAll
的集合上使用forEach
。 例如:
if (typeof NodeList !== "undefined" && NodeList.prototype && !NodeList.prototype.forEach) { // Yes, direct assignment is fine here, no need for `Object.defineProperty` NodeList.prototype.forEach = Array.prototype.forEach; }
(无需Object.defineProperty
以上, enumerable
[出奇], configurable
,和writable
都是true
为它在Chrome和Firefox,所以我们可以做直接分配同上。)
...然后您的$
当然变成了
function $(selector) { return document.querySelectorAll(selector); }
(首先。如果要添加更多功能,则可能希望采用#1的方式。)
返回一个数组:
function $(selector) { return Array.from(document.querySelectorAll(selector)); }
或在ES5中:
function $(selector) { return Array.prototype.slice.call(document.querySelectorAll(selector)); }
Array
子类(无法在ES2015之前的JavaScript引擎上完美地填充),因此您可以在Array
的功能之上添加自己的功能:
class MyThingy extends Array { // Perhaps further methods here } function $(selector) { return MyThingy.from(document.querySelectorAll(selector)); }
这里没有ES5选项,您至少需要进行Transpile和polyfill。
如果您要添加Array
提供的功能之外的功能,除了可以使用的polyfilling很好之外,我非常喜欢#4。 这可能足以满足您的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.