Javascript 查找除某些指定属性之外的所有元素

Javascript 查找除某些指定属性之外的所有元素,javascript,attributes,Javascript,Attributes,如何找到除某些指定属性之外的所有元素的任何属性?例如:除(href+title+id)之外的任何其他属性。唯一的方法是循环浏览页面中的所有元素并过滤掉不需要的元素 在这个实现中,您传递了一个要忽略的属性数组(以及可选的标记类型),它返回了一个元素数组,这些元素具有一些属性,而不是您传入的属性之一: function getElemsWithOtherAttribute(attArray, tags) { tags = tags || "*"; // put all passed

如何找到除某些指定属性之外的所有元素的任何属性?例如:除(href+title+id)之外的任何其他属性。

唯一的方法是循环浏览页面中的所有元素并过滤掉不需要的元素

在这个实现中,您传递了一个要忽略的属性数组(以及可选的标记类型),它返回了一个元素数组,这些元素具有一些属性,而不是您传入的属性之一:

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中的每个元素——但是我们必须了解更多关于您试图解决的实际问题的信息,以便提出更好的想法。