属性を.filter
チェックしている多数の要素に対して関数を使用したいのですが、それらはメソッドによって設定されています。data-*
.data
問題は、jQuery セレクターが常に元の値を使用することです。を使用してデータ値を設定して$('whatever').data('key', newValue)
からセレクターを使用しようとすると$('[data-key=newValue]')
、何も見つかりません。
ここに私のテストHTMLがあります:
<div id="test" data-dummy="foo"></div>
<div id="result"</div>
それで:
$('#test').data('dummy', 'bar');
$('#result').
append('<div>Where dummy=foo: ' + $('[data-dummy="foo"]').length + '</div>').
append('<div>Where dummy=bar: ' + $('[data-dummy="bar"]').length + '</div>');
出力:
ダミー = フー :1
ダミー = バー :0
セレクターエンジンの場合、元の値のみがセレクターで使用されるようです。
更新- 最初の回答に乾杯します。これは実際には意図的なものです。.data
値で始まりdata-*
ますが、独自のコピーを設定します。.data(
へのすべての呼び出しを への呼び出しに置き換えたくありません.attr('data-' +
。
これを回避するために.filter
関数を使用していますが、このフィルターは多数の要素に対して実行されるため、一致ごとに新しい jQuery オブジェクトを作成したくありません。この種の状況のために、jQuery はいくつかのグローバル関数を提供します。
$.data(element,
基本的にの代わりにを使用できるはずです$(element).data(
が、これも機能しませ$.data(element,
んundefined
。
だから私のコードは次のようになります.filter(function(){return $.data(this, key) === value;})
ただし、それは jQuery オブジェクトが初期化される前のみのようです。
var domEle = document.getElementById('test');
var globalBefore = $.data(domEle, 'dummy');
var first = $(domEle).data('dummy');
var globalAfter = $.data(domEle, 'dummy');
$('#result').
append('<div>$.data before: ' + globalBefore + '</div>').
append('<div>new $(): ' + first + '</div>').
append('<div>$.data after: ' + globalAfter + '</div>');
出力:
前の $.data: 未定義
新しい $(): フー
$.data after: foo
変。問題は、それを回避できるかどうかです。$
テストされたノードごとにオブジェクトを作成せずに、新しいオブジェクトで起こっていることを初期化する方法はありますか?
JS Fiddle デモ: http://jsfiddle.net/kU4th/