Javascript 使用函数更新jQuery的data()方法中的值将设置与匿名函数等效的变量,而不是返回值

Javascript 使用函数更新jQuery的data()方法中的值将设置与匿名函数等效的变量,而不是返回值,javascript,jquery,Javascript,Jquery,我回答这个问题: 使用此jQuery: $('img').attr('u', function(i,u) { /* i is the index of the current image among all the images returned by the selector, u is the current value of that attribute */ return u.slice(0, -1) + (parseInt(u.replace(/\D/g,

我回答这个问题:

使用此jQuery:

$('img').attr('u', function(i,u) {
    /* i is the index of the current image among all the images returned by the selector,
       u is the current value of that attribute */
    return u.slice(0, -1) + (parseInt(u.replace(/\D/g,''), 10) + 1);
});

但后来我觉得我应该展示如何“正确地”使用HTML5允许的自定义
data-*
属性(而不是无效的、尽管功能性的自定义属性),因此我将HTML改编为:

<img src="http://placekitten.com/400/500" class="className" click="" id='button4' data-u="button6" data-r="button5" data-l="ele1" data-d="" />


现在,使用
data()
方法,我意识到属性不会被更新,这就是为什么我使用
console.log()
来确认更新的值,但是,输出是匿名函数本身,而不是我期望从该函数返回的值。我意识到这不太可能是一个bug,而且可能是预期的行为,但是有没有一种方法可以使用匿名函数来更新属性,就像在
attr()
text()
等中使用的方法一样?

基本上你的预期是错误的

jQuery的
.data
根本不修改元素的数据属性;它只是通过自己选择的机制将您提供的数据与元素相关联

故意不指定实现,并且
.data
根本不处理此数据;你把东西放进去,当你以后要的时候,那正是你得到的。从jQuery的角度来看,数据是完全不透明的


确实,
.data
提供了从HTML
data-
属性预填充元素关联数据的便利功能,但这不是它的主要任务。当然,在这种情况下,数据的不透明性仍然存在:当您请求数据时,您可以准确地返回HTML中指定的内容。

数据与许多其他jquery函数(例如
attr
和许多其他函数)之间的区别在于
数据
可以存储任何类型的对象<代码>属性只能存储字符串值。因此,使用
data
存储函数是完全有效的

如果jquery团队要对
数据
进行类似的签名,他们需要以某种方式区分想要存储函数和想要评估函数。它可能会变得太混乱,所以它们只是没有包含执行函数的功能


我认为您最好使用
每个

如果您需要此功能,您可以轻松添加它:

$.fn.fdata = function( name, callback ) {
    return this.each( function( i, element ) {
        var $element = $(element);
        var data = callback( i, $element.data(name) );
        $element.data( name, data );
    });
};
现在您可以使用
$(sel).fdata(名称,回调)
并在回调中执行所需操作

扩展现有的
$().data()
方法来添加回调功能可能很有诱惑力,但正如其他人所指出的,这将破坏依赖于能够将函数引用存储为数据的任何其他代码

当然,仅仅添加这个
.fdata()
方法也可能会破坏其他代码——如果页面上的其他代码也试图在自己的插件中使用相同的方法名称。因此,把它变成一个简单的函数可能更明智。无论哪种方式,代码都几乎相同:

function updateData( selector, name, callback ) {
    $(selector).each( function( i, element ) {
        var $element = $(element);
        var data = callback( i, $element.data(name) );
        $element.data( name, data );
    });
}

昨天我考虑过这个问题,不幸的是
data
方法不接受回调函数。它通过存储该函数而不是使用其返回值来设置数据值。我们必须使用
each
。这似乎是一个疏忽(尽管我承认选择中断与其他方法的连续性可能有正当的理由)。因此,为了满足我的期望,我应该使用
attr()
。each()
方法来修改相关的值?谢谢!这并不是说我需要它,我只是好奇为什么它没有像我期望的那样工作,因为它与使用(大多数)其他jQuery方法所设置的期望有很大的不同。
function updateData( selector, name, callback ) {
    $(selector).each( function( i, element ) {
        var $element = $(element);
        var data = callback( i, $element.data(name) );
        $element.data( name, data );
    });
}