2016-09-16 10 views
0

データベースから結果をレンダリングするテーブルがあります。 Beacause結果は、私はいくつかのアクション(すなわち「編集」/「パブリッシュ」/など)を可能にするボタンがあり、マークアップテーブル内の各列についてjQuery反復/ループスルーデータテーブルクリックボタン

<table> 
<thead> 
</thead> 
    <tbody> 
     <td>some datas inside TDs</td> 
     <td>Last TD<button class = 'btn-action-edit'></button></td> 
    </tbody> 
    <tbody> 
     <td>some datas inside TDs</td> 
     <td>Last TD<button class = 'btn-action-edit'></button></td> 
    </tbody> 
    <tbody> 
     <td>some datas inside TDs</td> 
     <td>Last TD<button class = 'btn-action-edit'></button></td> 
    </tbody> 
<tfooter> 
</tfooter> 
</table> 

を与える、「マトリックス」です。 ボタンをクリックすると、何かアクションをしたいです。

$('tbody:nth-child(2) .btn-action-edit').on('click', function() { 
    $('tbody:nth-child(2) .detail-edit').toggleClass('open'); 
}); 
$('tbody:nth-child(2) .close-edit').on('click', function() { 
    $('tbody:nth-child(2) .detail-edit').toggleClass('open'); 
}); 

$('tbody:nth-child(3) .btn-action-edit').on('click', function() { 
    $('tbody:nth-child(3) .detail-edit').toggleClass('open'); 
}); 
$('tbody:nth-child(3) .close-edit').on('click', function() { 
    $('tbody:nth-child(3) .detail-edit').toggleClass('open'); 
}); 

が、私は私のDBまたは1000 +に50+のエントリを取得すると仮定すると、私がいくつかを試してみました仕事

を行うには悪夢になるだろう:私は以下のなかったことを実現するために

$('table > tbody td:last-child').each(function (index) { 
    $(this).find('.btn-action-edit').on('click', function(e) { 
      e.preventDefault(); 
      $('.detail-edit').toggleClass('open'); 
    }); 
}); 

でも動作しません。

これに関するアイデア。私はループやDOMに関する何かが欠けている!

ありがとうございました

答えて

0

このようなものはうまくいくはずです。

$(".btn-action-edit").on("click", function() { 
    $(this).closest("tbody").find(".detail-edit").toggleClass("open"); 
}); 

更新:

あなたはAjaxを経由でコンテンツをロードしているとして、あなたはこのように、一般的なイベントリスナーを設定できます。

$(document).on("click", ".btn-action-edit", function() { 
    $(this).closest("tbody").find(".detail-edit").toggleClass("open"); 
}); 

これは、アイテムかどうかをピックアップしますそれがロードされたとき、または後でAjaxで引っ張られたときにページ上にありました。

+0

それが実際に動作します... と私が苦しんでいたものよりもsimplier!すばらしいです。ありがとう。 – Horacio

0

すべての結果がサーバーによってレンダリングされ、それを追加するだけの場合は、eventListenerをクラスに追加してイベントターゲットに対して相対的に使用するのはなぜですか?

$('button.btn-action-edit').on('click', function() { 
    $(this).closest('tbody').find('.detail-edit').toggleClass('open'); 
}); 

$('button.close-edit').on('click', function() { 
    $(this).closest('tbody').find('.detail-edit').toggleClass('open'); 
}); 

要素をajaxでロードする場合は、追加されたコンテンツにもリスナーを追加する必要があります。しかし、イベントリスナの多くは良いものではありません、私はボタンのonclick属性を使用することをお勧めいたします:

<button class="btn-action-edit" onclick="itemEdit(this);"> ... </button> 
<button class="close-edit" onclick="closeItemEdit(this);"> ... </button> 

<script> 
function itemEdit(element) 
{ 
    $(this).closest('tbody').find('.detail-edit').toggleClass('open'); 
} 

function closeItemEdit(element) 
{ 
    $(this).closest('tbody').find('.detail-edit').toggleClass('open'); 
} 
</script> 
+0

はい、要素がajaxでロードされていると私は "addEventListener"について考えましたが、どのように見つけられませんでした。私はあなたの解決策を試してみるつもりです。ありがとう。 – Horacio

+0

.on関数はHTMLElement.addEventListenerを使用していますが、ほとんど同じですが、jQueryは内部リスナーをいくつか保存します。例えば、イベントリスナーを削除できる.offメソッドです。 – adaliszk

+0

これは、私が最初にjQueryを "古典的な" javascriptよりも先に選択すると思ったことです。私は最初にループ関数のための "シンプルな"ものを書こうと始めましたが、私の目標を達成できませんでした。だから私はおそらく何かを逃した。 しかしそれは知っているのは良いことです。 – Horacio