Javascript 如何删除元素上的所有数据属性?

Javascript 如何删除元素上的所有数据属性?,javascript,jquery,html,Javascript,Jquery,Html,我已经在stackoverflow中查看了很多帖子,但是,即使很多解决方案都应该有效,但对我来说仍然不起作用 我在引导中有一个模式,其中有一个引导复选框列表(样式) 每个复选框都有一组数据属性,直接从AJAX请求设置,因此,这些属性不是通过jQuery设置的 在我的情况下,我需要在切换复选框时从复选框中删除所有数据属性,并添加一些其他属性 然而,问题是我无法移除它们 我首先尝试使用jQuery.removeData(),但后来我了解到,如果至少有一个数据属性是通过jQuery设置的,那么它实际上

我已经在stackoverflow中查看了很多帖子,但是,即使很多解决方案都应该有效,但对我来说仍然不起作用

我在引导中有一个模式,其中有一个引导复选框列表(
样式)

每个复选框都有一组数据属性,直接从AJAX请求设置,因此,这些属性不是通过jQuery设置的

在我的情况下,我需要在切换复选框时从复选框中删除所有数据属性,并添加一些其他属性

然而,问题是我无法移除它们

我首先尝试使用
jQuery.removeData()
,但后来我了解到,如果至少有一个数据属性是通过jQuery设置的,那么它实际上只会删除数据属性,因此这不是我的情况

所以,我仔细检查了一下,发现我应该使用
jQuery.removeAttr()
prototype并删除每个数据元素

因此,我的情况是:

$('.modal_day_checkbox').on('change', function(){
        if ($(this).is(':checked')) {
            removeAllData($(this));
            $(this).data('newid', 'test_id');
            console.log($(this).data());
        }
        else {
            removeAllData($(this));
            $(this).data('testID', 'ID_NEW');
            console.log($(this).data());
        }
    });
为了获得干净的代码,我实现了函数removeAllData:

function removeAllData(object) {
        $.each(object.data(), function(i, v) {
            object.removeAttr("data-"+i);
            console.log('removing: '+'data-'+i);
        });
    }
它只是在对象中循环,以检查它具有哪些数据属性,并且应该将其删除

令人惊讶的是,结果是:

$('.modal_day_checkbox').on('change', function(){
        if ($(this).is(':checked')) {
            removeAllData($(this));
            $(this).data('newid', 'test_id');
            console.log($(this).data());
        }
        else {
            removeAllData($(this));
            $(this).data('testID', 'ID_NEW');
            console.log($(this).data());
        }
    });


有什么想法吗?

尝试调用jQuery
.removeData
函数以及您的
removeAllData
函数:

function removeAllData(object) {
    $.each(object.data(), function(i, v) {
        object.removeAttr("data-"+i);
        console.log('removing: '+'data-'+i);
    });
    object.removeData();  // clear the cache too
}
jQuery维护一个单独的对象,在该对象中,
数据foo
值一经访问就被缓存(以及存储对
.data
的写入),当调用
.removeAttr('data-foo')
时,缓存不会被清除。这是错误的

object.removeAttr("data-"+i);
//您必须传入属性的名称

改为这样做

 $.each(object.data(), function(i, v) {
            object.removeAttr(v);
            console.log('removing: '+v);
        });

//删除的引号

选择的解决方案效果很好,但会破坏多破折号属性(如
数据一二
),因为:

自jQuery3以来,每两个字符的“-”(U+002D)序列后面都有一个 键中的ASCII字母由小写字母替换为大写字母 字母的版本,与HTML数据集API保持一致。A. 语句,如
$(“body”).data({“我的名字”:“aValue”}).data()
将返回
{myName:“aValue”}

要使
data()
的结果与
removeAttr()
一起工作,我们应该将它们恢复到正常状态:

function removeAllData(object) {
    $.each(object.data(), function(i, v) {
        i = i.replace(/([A-Z])/g, function(all, letter) {
            return '-' + letter.toLowerCase()
        });  // fix multi-dash attributes
        object.removeAttr("data-"+i);
        console.log('removing: '+'data-'+i);
    });
    object.removeData();  // clear the cache too
}

这不是一个理想的解决方案,但在大多数情况下都应该有效。

你的意思是我应该用.removeData替换.removeAttr?是的,但不要附加
数据-
前缀。只是
object.removeData(i)
的确,我尝试过它,而且确实有效。。妈的,我差一点就到了:P谢谢!只要系统允许,我会尽快接受答案,我必须等待8分钟:)如果有人仍在阅读问题,解决方案是,按照@Alnitak的建议,将.removeAttr替换为.removeatta,提供每个循环的索引[I]!根据文档,您将使用数据的名称,而不是其索引。事实上,我只是建议大家都调用自己的函数和
object.removeData()
,以确保缓存和HTML属性都被删除。如果数据属性,如你所说,不是由jQuery添加的,为什么需要
removeData
,从内部jQuery数据对象中删除数据?啊,所引用的索引实际上是一个键,而不是一个数字。这是可行的,但您可以不使用任何键调用
.removeData()
,一次完成所有操作。@根据我的经验,任何对
数据
属性的访问都会导致缓存被创建,这不仅仅是创建。抱歉,这不起作用。这给我带来了一个意想不到的无效字符错误。不管怎样,谢谢你否决了上面的问题和答案