首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“对象不支持此属性或方法”IE10/11

“对象不支持此属性或方法”IE10/11
EN

Stack Overflow用户
提问于 2017-09-05 14:41:40
回答 1查看 1.6K关注 0票数 1

随着ES6的掌握,我渴望放弃jQuery,在我的网站构建中使用本地JS,以保持它们的快速和轻量级。也是为了提高我的JS技能,因为我是那些直接跳入jQuery的人之一。

我正在构建一个很小的库,以便在函数中使用更常用的javascript来保持文件的小。

代码语言: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

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-05 14:46:06

您将forEach添加到window对象中,而不是将其添加到您返回的对象中;您将$作为函数调用,而不是作为构造函数调用。由于您使用的是松散模式(显然),函数调用中的this是对全局对象的引用(在浏览器上也可以作为window访问)。您将从querySelectorAll返回该集合,未作修改。

它在Chrome上工作的原因是querySelectorAll返回的集合有自己的forEach (这是最近添加的)。

要做到这一点,有四种选择:

  1. 返回一个对象并向其添加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;//可能映射、筛选器等;添加一个循环?返回结果;}返回$;})();
  2. forEach添加到NodeList原型(如果还没有),并直接在来自querySelectorAll的集合上使用forEach。例如: 如果(类型为NodeList !== "undefined“&& NodeList.prototype && NodeList.prototype.forEach ){ //是,直接赋值在这里是可以的,则不需要Object.defineProperty NodeList.prototype.forEach= Array.prototype.forEach;} (上面不需要Object.defineProperty,令人惊讶的是,enumerableconfigurablewritable都是Chrome和Firefox上的true,所以我们可以像上面这样直接分配。) ...and,那么你的$当然就变成了 函数$(选择器){返回document.querySelectorAll(选择器);} (一开始。如果你想增加更多的功能,你可能会想要走#1的道路。)
  3. 返回一个数组: 函数$(选择器){返回Array.from(document.querySelectorAll(selector));} 或者在ES5中: 函数$(选择器){返回Array.prototype.slice.call(document.querySelectorAll(selector));}
  4. 子类Array (在ES2015之前的JavaScript引擎上不能完全填充),因此您可以在Array的功能之上添加您自己的功能: 类MyThingy扩展了数组{ //可能这里的进一步方法}函数$(选择器){返回MyThingy} 这里没有ES5选项,您至少需要传输和填充。

如果您要添加的特性超出了Array提供的功能,我非常喜欢#4,而不是只提供"so“好的填充。这可能对你的目的来说就足够了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46057719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档