2015-07-28 14 views
9

Ich bin neu hier (und neu in JavaScript), also bitte entschuldigen Sie meine super grundlegenden Fragen. Ich habe eine HTML-Seite mit verschiedenen Bildern, die alle eine Klasse teilen. Mit getElementsByClassName erhalte ich ein Array. Ich möchte jeder Zelle in dem Array einen Ereignis-Listener hinzufügen, indem Sie die Map() - Funktion verwenden.Javascript .map() ist keine Funktion

Das ist, was ich habe:

window.onload = function(){ 
var allImgs = document.getElementsByClassName("pft"); 

var newImgs = allImgs.map(
     function(arrayCell){ 
      return arrayCell.addEventListener("mouseover, functionName"); 
     } 
    ); 
}; 

Dies hält den Fehler zeigt „allImgs.map ist keine Funktion“, auch wenn ich die innere Funktion, um etwas zu ändern, die nicht den Ereignis-Listener nicht enthält.

Ich habe eine andere Version dieses Codes, wo ich nur die Array-Zellen innerhalb von window.onload durchlaufen und den Ereignis-Listener zu jedem von ihnen auf diese Weise hinzufügen und es funktioniert. Warum funktioniert die .map() - Funktion nicht? Kann es nicht in window.onload verwendet werden?

Antwort

18

getElementsByClassName() gibt ein HTMLCollection keine Array. Man muss es in ein Array zuerst JavaScript konvertieren:

allImgs = Array.prototype.slice.call(allImgs); 
// or 
allImgs = [].slice.call(allImgs); 
// or 
allImgs = Array.from(allImgs); 
+0

http://stackoverflow.com/questions/222841/most-efficient-way-to-convert-an-htmlcollection-to-an-array – baao

+0

Das macht jetzt viel mehr Sinn, danke. – JSn00b

+0

@ Flawyte Eek, es funktioniert noch nicht für mich. Ich übersehe wahrscheinlich etwas Super-Basic. Folgendes habe ich bekommen: 'window.onload = function() { \t var allImgs = document.getElementsByClassName (" pft "); \t var newImgs = [] .slice.call (allImgs); \t console.log (newImgs.typeof); \t newImgs.map ( \t \t \t Funktion (arrayCell) { \t \t \t \t return arrayCell.addEventListener ("mouseover, flipOver"); \t \t \t} \t); }; ' – JSn00b

2

Mit getElementsByClassName erhalte ich ein Array.

Nein, tun Sie nicht.

Sie erhalten eine Live HTMLCollection. Dies ist Array-ähnlich, ist aber kein Array.

Da es ausreichend Array-ähnlich ist, können Sie die map Methode aus einem echten Array anwenden.

var text_content = [].map.call(
 
     document.getElementsByClassName("sdf"), 
 
     function (currentValue, index, collection) { 
 
     return currentValue.innerHTML; 
 
     } 
 
    ); 
 
    console.log(text_content);
<p class="sdf">foo</p> 
 
    <p class="sdf"></p> 
 
    <p class="sdf">bar</p> 
 
    <p class="sdf"></p> 
 
    <p class="sdf"></p> 
 
     

+0

Oh, ich sehe, danke, dass du das geklärt hast. also könnte ich nie .map() verwenden, weil es kein echtes Array ist? Aber ich kann immer noch Zugriff auf seine Zellen bekommen, so wie ich es von einem Array bekommen würde (wie in htmlColls [i] .addEventListener; etc)? – JSn00b

3

Eine andere Möglichkeit wäre map direkt zu verwenden:

[].map.call(allImages, function() { ... }); 

jedoch, was Sie tun, ist besser mit Array.prototype.forEach erreicht.