我想对.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>');
输出:
其中 dummy=foo :1
其中 dummy=bar :0
看起来,对于选择器引擎,选择器中只使用原始值。
更新- 为最初的答案欢呼,这实际上是故意的。.data
从data-*
值开始,但设置自己的副本。我不想用调用来替换每个调用.data(
to .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 之前:未定义
新 $(): foo
$.data 之后:foo
诡异的。没关系,问题是我可以解决它吗?有没有办法初始化一个新$
对象发生的任何事情,而不为每个测试节点创建一个?
JS Fiddle 演示:http: //jsfiddle.net/kU4th/