4

jQuery + dataTables プラグインを使用しているときに、奇妙な動作に遭遇しました。

次のテーブルがあるとします。

<table id="myTable">
    <thead>
        <th>col 0</th>
        <th>col 1</th>
    </thead>
    <tbody>
        <tr>
            <td><input type="checkbox" /></td>
            ...
        </tr>
        ...
    </tbody>
</table>

私は document.ready を呼び出し$('#myTable').dataTable({...});、ボタンをクリックしたときに入力をチェックしたすべての行を取得したいと考えています (それらがテーブルの現在のページにない場合でも)。

すべての行 (未チェックを含む) を取得するには、これらすべての tr ノードを含む配列を返す$('#myTable').dataTable().fnGetNodes()( API-Link ) を使用します。その後、この配列を使用して jQuery オブジェクトを作成します。

var nodearray = $('#myTable').dataTable().fnGetNodes();
var trs = $(nodearray);

わからない部分が出てきます。チェックされたすべてのノードを取得するために 2 つの方法を試しましたが、結果は異なりました。

// returns all rows correctly (including invisible rows from other pages)
trs.find('td input:checked').closest('tr'); 

// return only rows from the current page
trs.has('td input:checked');

jQuery.has() がそれらを見つけられないように DataTables-plugin は行を非表示にするために何をしますか? jQuery.find() はなぜまだ機能しますか?

PS:ここで簡単なフィドルを作成しました

4

1 に答える 1

3

DOM を調べると、現在のページ要素のみが DOM の一部であることがわかります。他の要素は、単に DOM になく、メモリにのみ存在するという理由だけで非表示になっています。

ただし、不一致の問題については、1.8.x より前のバージョンの jQuery でのみ発生するように思われるため、おそらく修正されたライブラリのバグです。

has1.8.x より前のバージョンのメモリ内要素に対してメソッドが機能しないことを示すテスト ケースを次に示します。

console.log($('<div><span></span></div>').has('span').length); //0

編集:これはバグで、チケットを見つけました: http://bugs.jquery.com/ticket/11543

于 2013-09-20T13:09:34.090 に答える