我认为我正确使用了removeData但它似乎没有工作,这是我在开发控制台中看到的,有人能解释我做错了吗?
我正在输出当前的数据属性值,调用removeData,然后再次输出该值,它仍在那里。
$('.questionList > li').eq(1).data('fieldlength')
3
$('.questionList > li').eq(1).removeData('fieldlength');
[
<li class="questionBox" data-createproblem="false" data-fieldlength="3" data-picklistvalues data-required="true" data-sfid="a04d000000ZBaM3AAL" data-type="Text">
<div class="questionLabel">Birthdate</div>
</li>
]
$('.questionList > li').eq(1).data('fieldlength')
3
答案 0 :(得分:31)
我想澄清一些问题,以防万一其他人偶然发现它......
如果您对某个元素有HTML5 data-*
属性,则需要使用jQuery的removeAttr()
代替removeData()
,如果您想从DOM中的元素中删除它们。
例如,要从您需要使用的元素中实际删除数据属性:
$({selector}).removeAttr('data-fieldlength');
您可以使用$({selector}).data('fieldlength')
读取这样的值,但removeData()
如果它们是页面源中存在的元素的HTML属性,则实际上不会删除它们(它只是删除它在内存中,所以如果你再次使用jQuery查询它出现已被删除。)
就我个人而言,我认为这种行为已被打破,我确信会吸引很多人。
答案 1 :(得分:28)
这是因为您的data
来自HTML data-fieldlength
属性。根据{{3}}:
使用.removeData(“name”)时,jQuery将尝试查找数据 - 如果没有该名称的属性,则该元素属性 内部数据缓存。为避免重新查询data-attribute,请设置 值为null或undefined的名称(例如.data(“name”, undefined))而不是使用.removeData()。
所以而不是
$('.questionList > li').eq(1).removeData('fieldlength');
你应该做
$('.questionList > li').eq(1).data('fieldlength',null);
答案 2 :(得分:2)
在隐藏字段中使用自定义数据属性来存储对象数据 应该使用.removeAttr()而不是.removeData()使用ID
答案 3 :(得分:1)
实际上这对我来说效果更好。因为它在元素中保留了属性,但没有赋值给它。
$(selector).attr("data-fieldlength","");
答案 4 :(得分:0)
.removeData()
将仅从jQuery的内部.data()
缓存中删除数据,因此不会删除该元素上的任何相应data-
属性。因此,稍后调用data()
将从元素的data-
属性中重新检索该值。为防止出现这种情况,请在.removeAttr()
旁边使用.removeData()
同时删除data-
属性。
示例:
$('div').removeData('info');
$('div').removeAttr('data-info');
然后设置:
$('div').data('info', 222);
$('div').attr('data-info', 222);
答案 5 :(得分:0)
一种选择是使用DOM自己的remove方法。索引0引用jQuery结果集中的第一个DOM元素,因此您可以对其直接进行DOM调用。
console.log($('[data-fieldlength]').data('fieldlength'));
$('[data-fieldlength]')[0].removeAttribute('data-fieldlength');
console.log($('[data-fieldlength]').data('fieldlength'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div data-fieldlength="42">Hello Elliot</div>