2016-06-30 13 views
0

Das Problem ist, dass wenn ich Seitennummerntasten am unteren Rand der Seite erstelle, der onclick immer nur mit dem letzten erstellten Element funktioniert.Hinzufügen eines onclick-Ereignisses zu einem neuen html-Element, das nur für das letzte Element funktioniert

Hier ist, was die Seite Tasten wie folgt aussehen:

Here is what the page buttons look like

for(var i = 0; i < numberOfPages; i++) { 
     if(Math.floor((((startIndex + 1)/10) + 1)) == (i + 1)) { 
      var newElement = document.createElement("u"); 
      document.getElementById("imagesNav").appendChild(newElement); 
      newElement.id = "imagesNavU"; 
      var newElement = document.createElement("a"); 
      document.getElementById("imagesNavU").appendChild(newElement); 
      var str = "page" + (i + 1); 
      newElement.innerHTML = i + 1; 
      newElement.onclick=function(){currentPageNumber(str);}; 
     } else { 
      var newElement = document.createElement("a"); 
      document.getElementById("imagesNav").appendChild(newElement); 
      var str = "page" + (i + 1); 
      newElement.innerHTML = i + 1; 
      newElement.onclick=function(){currentPageNumber(str);};   
     } 
     if(i + 1 != numberOfPages) { 
      document.getElementById("imagesNav").innerHTML += "&nbsp;&nbsp;"; 
     } 
    } 
} 

Die erste if-Anweisung legt einfach unterstrichenen Tags auf, wenn dieses Element die aktuelle Seite.

Edit: Das Problem wurde gelöst. Danke an alle für ihre Hilfe!

+0

Wäre viel einfacher zu helfen, wenn Sie zuerst den Code 'currentPageNumber()' -Funktion enthalten. – etherealite

+1

@etherealite Diese Funktion ist irrelevant, das Problem ist, dass alle Closures die selbe 'str'-Variable verwenden. – Barmar

+0

@Barmar Würde die Funktion trotzdem aufgerufen werden? Die Funktion wird immer nur mit der letzten Taste aufgerufen. – mtagius

Antwort

0

Das Problem ist mit diesem Teil der Schleife:

if(i + 1 != numberOfPages) { 
     document.getElementById("imagesNav").innerHTML += "&nbsp;&nbsp;"; 
    } 

Dies wird erneut Parsen alle die HTML im imagesNav Elemente. Dies erzeugt neue <a> Elemente, die nicht die onclick Bindungen haben, die die vorherigen hatten.

Stattdessen können Sie ein <span> Element anhängen, das die Leerzeichen enthält.

var numberOfPages = 3; 
 
var startIndex = 0; 
 

 
for (var i = 0; i < numberOfPages; i++) { 
 
    if (Math.floor((((startIndex + 1)/10) + 1)) == (i + 1)) { 
 
    var newElement = document.createElement("u"); 
 
    document.getElementById("imagesNav").appendChild(newElement); 
 
    newElement.id = "imagesNavU"; 
 
    var newElement = document.createElement("a"); 
 
    document.getElementById("imagesNavU").appendChild(newElement); 
 
    var str = "page" + (i + 1); 
 
    newElement.innerHTML = i + 1; 
 
    newElement.onclick = function() { 
 
     currentPageNumber(str); 
 
    }; 
 
    } else { 
 
    var newElement = document.createElement("a"); 
 
    document.getElementById("imagesNav").appendChild(newElement); 
 
    var str = "page" + (i + 1); 
 
    newElement.innerHTML = i + 1; 
 
    newElement.onclick = function() { 
 
     currentPageNumber(str); 
 
    }; 
 
    } 
 
    if (i + 1 != numberOfPages) { 
 
    var span = document.createElement('span'); 
 
    span.innerHTML = '&nbsp;&nbsp;'; 
 
    document.getElementById("imagesNav").appendChild(span); 
 
    } 
 
} 
 

 
function currentPageNumber(str) { 
 
    alert(str); 
 
}
<div id="imagesNav"> 
 

 
</div>

Ein anderer Weg, es zu tun ist, mit insertAdjacentHTML, die ohne erneute Parsing HTML zu einem Element hinzufügt, was in ihm schon ist.

document.getElementById("imagesNav").insertAdjacentHTML('beforeend', '&nbsp;&nbsp;'); 

Sie sollten auch JavaScript closure inside loops – simple practical example sehen, weil die Art und Weise Sie die str Variable verwenden, alle Klick-Handler den Wert aus der letzten Iteration der Schleife verwenden.

+0

Beachten Sie, dass Klicks funktionieren, aber alle '3 zurückgeben. Die richtige Form ist 'Funktion currentPageNumber (str) {return function() {alert (str);}}' und 'newElement.onclick = currentPageNumber (str);' –

+0

@AlexKudryashev Das ist das Problem, das ich im letzten Absatz des wies darauf hin, Antworten. – Barmar

+1

@AlexKudryashev Das ist, was ich ursprünglich dachte sein ganzes Problem war, so schloss ich die Frage als Duplikat. Dann sah ich das andere Problem, also öffnete ich es wieder und fügte einfach den Link als zusätzliche Information hinzu, da es nicht direkt mit der Frage zusammenhängt, die er gestellt hat. – Barmar

Verwandte Themen