2014-02-14 90 views
2

爲什麼下面的代碼不起作用(警報未執行)? custom_table是在HTML中,某些文件上傳域,它的長度是10JavaScript篩選器方法無法與getElementsByName一起使用

var custom_table=document.getElementsByName('custom_table'); 
var result = custom_table.filter(function (x) { return x.value }); 
alert(result.length); 

如果我在下面的代碼替換namescustom_table,它工作正常。

var names = new Array(); 
var object = { name : "Joe", value:20, email: "[email protected]"}; 

names.push(object); 
object = { name : "Mike", value:50, email: "[email protected]"}; 
names.push(object); 
object = { name : "Joe", value:45, email: "[email protected]"}; 
names.push(object); 

謝謝。

回答

2

getElementsByName返回一個HTMLCollection *,它不是一個數組。 filter()僅在陣列上。你可以轉儲到一個數組很輕鬆地:

var elementCollection = document.getElementsByName('myname'); 
var elementArray = Array.prototype.slice.call(elementCollection, 0); 
elementArray.filter(...); // this will now work 

*或NodeList,取決於瀏覽器,區別並不很重要,雖然

+0

您可以一步完成。不需要'Array.prototype.slice()'然後''.filter()'。只是'Array.prototype.filter.call(elemColl ...' –

+0

謝謝你的好例子和很好的解釋!和餅乾怪物的解決方案也可以。 – slowD

+0

@cookiemonster這是一個好點,如果'切片'工作,然後它使感覺其他數組方法會。 –

2

getElementsByName返回的值不是JavaScript數組。但是,您可以將內容複製到一個:

var custom_table=document.getElementsByName('custom_table'); 
custom_table = [].slice.call(custom_table, 0); 

然後.filter.map,等會工作。

+0

謝謝!你的回答也是正確的,但我只能將第一個標記爲最終答案。抱歉。 – slowD

+0

Pointy的回答在我的面前出現了,如果你想給他勾選對號。 –

相關問題