随着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
有什么想法吗?
发布于 2017-09-05 14:46:06
您将forEach
添加到window
对象中,而不是将其添加到您返回的对象中;您将$
作为函数调用,而不是作为构造函数调用。由于您使用的是松散模式(显然),函数调用中的this
是对全局对象的引用(在浏览器上也可以作为window
访问)。您将从querySelectorAll
返回该集合,未作修改。
它在Chrome上工作的原因是querySelectorAll
返回的集合有自己的forEach
(这是最近添加的)。
要做到这一点,有四种选择:
forEach
,将元素从QSA集合复制到该对象。例如:
函数$(选择器){ const结果= Array.from(document.querySelectorAll(selector));result.forEach = Array.prototype.forEach;//也许映射、筛选器等;添加一个循环?返回结果;}
或者在ES5中:
变量$=(函数()){ var方法= Array.prototype;函数$(选择器){ var结果= methods.slice.call(document.querySelectorAll(selector));result.forEach = methods.forEach;//可能映射、筛选器等;添加一个循环?返回结果;}返回$;})();forEach
添加到NodeList
原型(如果还没有),并直接在来自querySelectorAll
的集合上使用forEach
。例如:
如果(类型为NodeList !== "undefined“&& NodeList.prototype && NodeList.prototype.forEach ){ //是,直接赋值在这里是可以的,则不需要Object.defineProperty
NodeList.prototype.forEach= Array.prototype.forEach;}
(上面不需要Object.defineProperty
,令人惊讶的是,enumerable
、configurable
和writable
都是Chrome和Firefox上的true
,所以我们可以像上面这样直接分配。)
...and,那么你的$
当然就变成了
函数$(选择器){返回document.querySelectorAll(选择器);}
(一开始。如果你想增加更多的功能,你可能会想要走#1的道路。)Array
(在ES2015之前的JavaScript引擎上不能完全填充),因此您可以在Array
的功能之上添加您自己的功能:
类MyThingy扩展了数组{ //可能这里的进一步方法}函数$(选择器){返回MyThingy}
这里没有ES5选项,您至少需要传输和填充。如果您要添加的特性超出了Array
提供的功能,我非常喜欢#4,而不是只提供"so“好的填充。这可能对你的目的来说就足够了。
https://stackoverflow.com/questions/46057719
复制相似问题