2016-06-30 25 views
0

ページの下部にページ番号ボタンを作成すると、onclickは作成された最後の要素でしか動作しないという問題があります。ここで最後の要素でのみ動作する新しいhtml要素にonclickイベントを追加する

があるページのボタンがどのように見えるか:

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;"; 
     } 
    } 
} 

文はちょうどその要素が現在のページである場合には、下線のタグを置く場合は、最初。

編集:問題は解決されました。皆さん、ありがとうございました!

+0

'currentPageNumber()'関数を最初に組み込んだ方がはるかに簡単です。 – etherealite

+1

@etherealiteその関数は無関係ですが、問題はすべてのクロージャが同じ 'str'変数を使用していることです。 – Barmar

+0

@Barmar関数はまだ呼び出されますか?この関数は最後のボタンでのみ呼び出されます。 – mtagius

答えて

0

問題は、ループのこの部分である:

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

これはimagesNav要素内のすべてのHTMLを再解析しています。これにより、新規の<a>要素が作成されます。これには、前の要素と同じバインディングがonclickありません。

代わりに、スペースを含む<span>要素を追加できます。

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>

それを行うための別の方法はそれですでに何再解析せずに要素にHTMLを追加した、insertAdjacentHTMLです。

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

あなたがstr変数を使用している方法は、すべてのクリックハンドラは、ループの最後の繰り返しの値を使用しますので、あなたもJavaScript closure inside loops – simple practical exampleが表示されるはずです。

+0

クリックは機能しますが、すべては 'Page3'を返します。正しいフォームは 'function currentPageNumber(str){return function(){alert(str);}}'と 'newElement.onclick = currentPageNumber(str);' –

+0

です@AlexKudryashevそれは私が最後の段落で指摘した問題です。回答。 – Barmar

+1

@AlexKudryashevそれは私が元々彼の全問題があったと思っていたので、私はその質問を複写としてクローズしました。それから、別の問題を見たので、私はそれを再開し、追加情報としてリンクを追加しました。質問に直接関係していないからです。 – Barmar

関連する問題