Javascript 查找除某些指定属性之外的所有元素
如何找到除某些指定属性之外的所有元素的任何属性?例如:除(href+title+id)之外的任何其他属性。唯一的方法是循环浏览页面中的所有元素并过滤掉不需要的元素 在这个实现中,您传递了一个要忽略的属性数组(以及可选的标记类型),它返回了一个元素数组,这些元素具有一些属性,而不是您传入的属性之一:Javascript 查找除某些指定属性之外的所有元素,javascript,attributes,Javascript,Attributes,如何找到除某些指定属性之外的所有元素的任何属性?例如:除(href+title+id)之外的任何其他属性。唯一的方法是循环浏览页面中的所有元素并过滤掉不需要的元素 在这个实现中,您传递了一个要忽略的属性数组(以及可选的标记类型),它返回了一个元素数组,这些元素具有一些属性,而不是您传入的属性之一: function getElemsWithOtherAttribute(attArray, tags) { tags = tags || "*"; // put all passed
function getElemsWithOtherAttribute(attArray, tags) {
tags = tags || "*";
// put all passed in attributes in an object for fast lookup
// add leading underscore to avoid any built-in property conflicts
var attLookup = {}, i, j, len, results = [], atts;
for (i = 0, len = attArray.length; i < len; i++) {
attLookup["_" + attArray[i].toLowerCase()] = true;
}
// get all elements and loop through them all
var elems = document.getElementsByTagName(tags);
for (i = 0, len = elems.length; i < len; i++) {
// get all attributes on this element and loop through them all
// until we find one that isn't in our attLookup object
atts = elems[i].attributes;
for (j = 0; j < atts.length; j++) {
// if we have an attribute name that is not in our passed in list, then
// add this element to the results array
if (attLookup["_" + atts[j].name.toLowerCase()] !== true) {
results.push(elems[i]);
break;
}
}
}
return(results);
}
// example usage
var regAttributes = ["href", "title", "id"];
var items = getElemsWithOtherAttribute(regAttributes, "img");
函数getElemWithOtherAttribute(附件、标记){
标签=标签| |“*”;
//将所有传入的属性放在对象中以进行快速查找
//添加前导下划线以避免任何内置属性冲突
var attLookup={},i,j,len,results=[],atts;
对于(i=0,len=attArray.length;i
这将使用.attributes
集合获取HTML中为给定元素指定的所有属性的列表,然后查看属性节点上的.name
属性以查看给定属性的名称。var attrs=[“href”,“title”,“id”],
var attrs = ["href", "title", "id"],
els = document.getElementsByTagName("*"),
result = Array.prototype.slice.call(els).filter(function(el) {
if (el.attributes.length === 0)
return false;
for (var i = 0, l = attrs.length; i < l; i++) {
if (el.hasAttribute(attrs[i]))
return false;
}
return true;
});
console.log(result);
els=document.getElementsByTagName(“*”),
结果=Array.prototype.slice.call(els).filter(函数(el){
如果(el.attributes.length==0)
返回false;
对于(变量i=0,l=attrs.length;i
为什么?你想干什么?对我来说,这听起来像是XY问题。这也将返回没有属性的元素。每次循环时都会冗余地检查.length
)您应该首先检查属性的数量,然后循环该数量是否为非零。@Kolink这里是凌晨2点。你想从我这里得到什么好奇的;为什么要恢复?从计算属性长度一次到(仍然)数千次。(尽管它比conditional的中的要好。)@BrockAdams我认为它很小,因为获取属性几乎与获取变量的值相同。这个变体更短,看起来更可爱。我注意到你刚刚编辑了你的回复,虽然你之前的帖子已经解决了我的问题。你真有责任心!谢谢。VisioN的答案看起来更漂亮,虽然没有给出确切的结果,但我能理解他的理想。我想知道哪种方式可能会导致CPU更繁重的工作?@Erik-我刚刚添加了一个功能,以便您可以决定您感兴趣的标签类型(因为您可能希望这样),并添加了一个示例函数调用。我将属性放入一个对象中,因此,与VisonN每次在数组中循环相比,查找属性的效率可能更高-数组中的属性越多,差异就越明显。但是,与所有javascript性能比较一样,如果您真的想知道,您必须设置一个基准并使用一些有意义的样本数据测试每个算法。@Erik-FYI,如果性能是最重要的,然后,可能有更好的方法来解决您的问题,而不是查看DOM中的每个元素——但是我们必须了解更多关于您试图解决的实际问题的信息,以便提出更好的想法。