Javascript 如何删除元素上的所有数据属性?
我已经在stackoverflow中查看了很多帖子,但是,即使很多解决方案都应该有效,但对我来说仍然不起作用 我在引导中有一个模式,其中有一个引导复选框列表(Javascript 如何删除元素上的所有数据属性?,javascript,jquery,html,Javascript,Jquery,Html,我已经在stackoverflow中查看了很多帖子,但是,即使很多解决方案都应该有效,但对我来说仍然不起作用 我在引导中有一个模式,其中有一个引导复选框列表(样式) 每个复选框都有一组数据属性,直接从AJAX请求设置,因此,这些属性不是通过jQuery设置的 在我的情况下,我需要在切换复选框时从复选框中删除所有数据属性,并添加一些其他属性 然而,问题是我无法移除它们 我首先尝试使用jQuery.removeData(),但后来我了解到,如果至少有一个数据属性是通过jQuery设置的,那么它实际上
样式)
每个复选框都有一组数据属性,直接从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()
,一次完成所有操作。@根据我的经验,任何对数据
属性的访问都会导致缓存被创建,这不仅仅是创建。抱歉,这不起作用。这给我带来了一个意想不到的无效字符错误。不管怎样,谢谢你否决了上面的问题和答案