【问题标题】:Firefox error 'setting a property that only has a getter' when calling Array.prototype.slice调用 Array.prototype.slice 时 Firefox 错误“设置只有 getter 的属性”
【发布时间】:2011-02-23 06:32:38
【问题描述】:

我需要将 NodeList 对象转换为数组 - 在本例中是 <div> 元素的列表,因为我需要使用 map()filter() 方法来优化它。

不幸的是,在 Firefox(我测试了 3.6 和 4)中,我使用的方法引发了以下错误:

Error: setting a property that only has a getter

以下代码是相关行的精简版本。

trackList = [].splice.call(videoElement.querySelectorAll("div"),0);

这在 Chrome 和 Safari 中运行良好。它似乎与querySelectAll 方法无关,因为无论如何获得NodeList(例如使用document.getElementsByTagName("div"))都会出现同样的问题。

问题似乎出在call() 方法本身 - 给定一个预先存在的NodeList 并引用Array.prototype.slice 方法,以下仍然会失败:

sliceMethod.call(myNodeList,0);

不用说,我很难过 - 任何帮助或建议将不胜感激。

更新

这原来是一个印刷错误 - slice 而不是 splice 是有意的。

【问题讨论】:

  • 发布我的答案后,我在jsconsole 中尝试了Array.prototype.splice.call(document.getElementsByTagName('*'), 0);,效果很好。我仍然认为您可能打算使用slice,但看起来我的回答是错误的。您能否在jsfiddle 上发布一个演示此明显错误的最小示例?

标签: javascript arrays firefox


【解决方案1】:

我认为问题不在于call,而在于NodeList。 NodeLists(我认为总是)是实时的,这意味着如果添加一个新的 div,它会自动成为 NodeList 的一部分,或者如果它从文档中删除,它也会从 NodeList 中删除,等等。因此它不会从 NodeList 中取出任何东西都是有意义的,这就是 splice 所做的。我想您可能打算改用slice

【讨论】:

  • 确认!你完全正确!我整天都在盯着这段代码(我的同事也是如此),但我们没有发现错误。去表明让其他人看你的工作有帮助!谢谢:)
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 2011-06-04
  • 2019-02-24
  • 2021-05-31
  • 2019-06-30
  • 2022-07-27
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多