所以jquery api说如下:
从jQuery的内部.data()缓存中删除数据不会影响文档中的任何HTML5数据属性;使用.removeAttr()删除它们。
删除单个数据属性没问题。
<a title="title" data-loremIpsum="Ipsum" data-loremDolor="Dolor"></a>
$('a').removeAttr('data-loremipsum');
问题是,如何删除多个数据属性?
更多详情:
出发点是我有多个(让我们说.. 60) 不同的数据属性,我想删除所有这些属性。
首选方法是仅定位包含单词lorem
的数据属性。在这种情况下,lorem
始终是第一个单词。 (如果算上data-
),则为第二个
此外,我还希望保持所有其他属性的完整性
答案 0 :(得分:13)
// Fetch an array of all the data
var data = $("a").data(),
i;
// Fetch all the key-names
var keys = $.map(data , function(value, key) { return key; });
// Loop through the keys, remove the attribute if the key contains "lorem".
for(i = 0; i < keys.length; i++) {
if (keys[i].indexOf('lorem') != -1) {
$("a").removeAttr("data-" + keys[i]);
}
}
在这里小提琴:http://jsfiddle.net/Gpqh5/
答案 1 :(得分:5)
在my jQuery placeholder plugin中,我使用以下内容获取给定元素的所有属性:
function args(elem) {
// Return an object of element attributes
var newAttrs = {},
rinlinejQuery = /^jQuery\d+$/;
$.each(elem.attributes, function(i, attr) {
if (attr.specified && !rinlinejQuery.test(attr.name)) {
newAttrs[attr.name] = attr.value;
}
});
return newAttrs;
}
请注意,elem
是一个元素对象,而不是jQuery对象。
您可以轻松调整此内容,仅获取data-*
个属性名称:
function getDataAttributeNames(elem) {
var names = [],
rDataAttr = /^data-/;
$.each(elem.attributes, function(i, attr) {
if (attr.specified && rDataAttr.test(attr.name)) {
names.push(attr.name);
}
});
return names;
}
然后,您可以遍历生成的数组,并为元素上的每个项目调用removeAttr()
。
这是一个简单的jQuery插件应该可以解决这个问题:
$.fn.removeAttrs = function(regex) {
return this.each(function() {
var $this = $(this),
names = [];
$.each(this.attributes, function(i, attr) {
if (attr.specified && regex.test(attr.name)) {
$this.removeAttr(attr.name);
}
});
});
};
// remove all data-* attributes
$('#my-element').removeAttrs(/^data-/);
// remove all data-lorem* attributes
$('#my-element').removeAttrs(/^data-lorem/);
答案 2 :(得分:1)
下面的Vanilla JS清除所有数据属性。如果您想添加一些@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_activities, menu);
MenuItem menuItem = menu.findItem(R.id.activities_search);
SearchView searchView = (SearchView)menuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
s = s.toLowerCase();
final List<Activity> filteredModelList = new ArrayList<>();
for (Activity model : activities) {
final String text = model.getName().toLowerCase();
if (text.contains(s)) {
filteredModelList.add(model);
}
}
((SimpleAdapter)mSimpleAdapter).animateTo(filteredModelList);
mRecyclerView.scrollToPosition(0);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
逻辑来删除数据属性的子集,那么将该功能添加到下面的JavaScript中应该是微不足道的。
if
答案 3 :(得分:0)
我也会发布回答,因为花了一些时间从Mathias发布工作版本。
我遇到的问题是SVG需要额外的关注,没有什么细微差别(jQuery不喜欢它),但这里的代码也适用于SVG:
$.fn.removeAttrs = function(attrToRemove, attrValue) {
return this.each(function() {
var $this = $(this)[0];
var toBeRemoved = [];
_.each($this.attributes, function (attr) {
if (attr && attr.name.indexOf(attrToRemove) >= 0) {
if (attrValue && attr.value !== attrValue)
return;
toBeRemoved.push(attr.name);
}
});
_.each(toBeRemoved, function(attrName) {
$this.removeAttribute(attrName);
});
});
};
请注意它是使用下划线,但你可以用$ .each替换_.each我相信。
用法:
svgMapClone
.find('*')
.addBack()
.removeAttrs('svg-')
.removeAttrs('context-')
.removeAttrs('class', '')
.removeAttrs('data-target')
.removeAttrs('dynamic-cursor')
.removeAttrs('transform', 'matrix(1, 0, 0, 1, 0, 0)')
.removeAttrs("ng-");
答案 4 :(得分:0)
您可以循环特定元素的所有数据属性并过滤子字符串的索引。
<强> REMOVE_ATTR 强> 我使用了.removeAttr()方法,但可能能够使用.removeData()方法,具体取决于数据属性的创建方式。根据您的需要替换或组合。
$.each($('div').data(), function (i) {
var dataName = i, criteria = "lorem";
if (dataName.indexOf(criteria) >= 0) {
$('div').removeAttr("data-"+dataName);
}
});
SET NULL 您还可以根据业务逻辑将data-attribute设置为null。
$.each($('div').data(), function (i) {
var dataName = i, criteria = "lorem";
if (dataName.indexOf(criteria) >= 0) {
$('div').data(dataName, "");
}
});
答案 5 :(得分:0)
使用jQuery方法 removeData()
jQuery网站状态:
.removeData()方法使我们可以删除以前 之前使用.data()设置的。当用键名调用时, .removeData()删除该特定值。当没有呼叫 参数,.removeData()删除所有值。
这里的关键部分是:
不带电话时 参数,.removeData()删除所有值。
答案 6 :(得分:-3)
遗憾的是,在jQuery中不可能选择以给定值开头的属性名称(对于属性值,它是可能的)。
我提出的最简单的解决方案:
$(document).ready(function(){
$('[data-loremIpsum], [data-loremDolor]').each(function(index, value) {
$(this).removeAttr('data-loremIpsum')
.removeAttr('data-loremDolor');
});
});
JsFiddle Demo(确保在点击运行后查找html源代码)