桃花長相依
2019-12-26 10:12:21
我有一個接受HTML節點列表的Javascript函數,但它需要一個Javascript數組(它在該數組上運行一些Array方法),并且我想向其提供Document.getElementsByTagName返回DOM節點列表的輸出。最初,我想到了使用簡單的方法:Array.prototype.slice.call(list,0)而且,這在所有瀏覽器中都可以正常工作,除了Internet Explorer會返回錯誤“ JScript對象預期”外,因為Document.getElement*方法返回的DOM節點列表顯然不足以成為函數調用目標的JScript對象。注意事項:我不介意編寫Internet Explorer特定的代碼,但是我不允許使用任何Javascript庫(例如JQuery),因為我正在編寫要嵌入到第三方網站中的小部件,并且無法加載外部庫會給客戶帶來沖突。我最后的努力是遍歷DOM節點列表并自己創建一個數組,但是有沒有更好的方法呢?
3 回答

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
ECMAScript規范指出:NodeLists是宿主對象,Array.prototype.slice不能保證在宿主對象上使用方法可以正常工作。
slice函數是否可以成功應用于宿主對象取決于實現。
我建議您做一個簡單的函數來遍歷NodeList并將每個現有元素添加到數組中:
function toArray(obj) {
var array = [];
// iterate backwards ensuring that length is an UInt32
for (var i = obj.length >>> 0; i--;) {
array[i] = obj[i];
}
return array;
}
更新:
正如其他答案所建議的那樣,您現在可以在現代環境中使用傳播語法或Array.from方法:
const array = [ ...nodeList ] // or Array.from(nodeList)
但是考慮一下,我想將NodeList轉換為Array的最常見用例是對其進行迭代,現在該NodeList.prototype對象具有本forEach機方法,因此,如果您在現代環境中,則可以直接使用它,也可以使用滿溢的
添加回答
舉報
0/150
提交
取消