Javascript通过它的属性检索元素

时间:2011-09-07 14:38:18

标签: javascript html dom

每个HTML元素都有偏移值。我可以返回一个元素,例如offsetLeft > 10

从未听说过这个功能,因此问题就在这里。

我知道这可以通过循环完成,但这些都很慢。有一个关于XPath的想法,但找不到与引用内属性相关的任何内容。

提前致谢!

P.S。不需要过时的浏览器兼容性 - HTML5'可以做到。

5 个答案:

答案 0 :(得分:4)

据我所知,没有办法做到这一点,不涉及某种形式的循环。您可以在标准JS中执行以下操作:

var elems = document.getElementsByTagName("*"),
    myElems = [];
for(var i = 0; i < elems.length; i++) {
   if(elems[i].offsetLeft > 10) myElems.push(elems[i]);
}

或者,如果你正在使用jQuery,你可以用更少的代码来做(但它可能更慢!):

var myElems = $("*").filter(function() {
    return $(this).offset().left > 10;
});

如果您考虑一下,您希望选择具有特定属性值的文档中的所有元素。无论你是否自己编写循环,总是会涉及一个循环,因为每个元素都必须被检查。

答案 1 :(得分:0)

你看过这个页了吗? offset

答案 2 :(得分:0)

jQuery可以轻松选择元素的属性

<div>Dont find me</div>
<div this="yes">Find me</div>

$('div[this=yes]'); // will select the second div

您将遇到的问题是偏移和位置等问题是计算值,而不是预先存储在带有元素的dom中。如果你需要选择这个,我建议把它们作为dom元素本身的属性。然后上面的方法工作得很好。

答案 3 :(得分:-1)

我建议最好的方法是扩展jQuery的选择器。这样的事情效果很好:

$.extend($.expr[':'],{

        offsetLeft: function(a,i,m) {
            if(!m[3]||!(/^(<|>|=)\d+$/).test(m[3])) {return false;}
            var offsetLeft = $(a).offset().left;
            return m[3].substr(0,1) === '>' ?
                 offsetLeft > parseInt(m[3].substr(1),10) :
                     m[3].substr(0,1) === '<' ? offsetLeft < parseInt(m[3].substr(1),10) :
                         offsetLeft == parseInt(m[3].substr(1),10);
        }
});

这将允许您使用语法(例如

)选择元素

$('span:offsetLeft(>10)')

$('.someClass:offsetLeft(<10)')

甚至

$('.someClass:offsetLeft(=10)')

实例:http://jsfiddle.net/X4CkC/

应该将这个钩子添加到jQuery的选择器中,这些选择器通常非常快,但毫无疑问,在某个深处,有一个循环正在进行。没有办法避免这种情况。

答案 4 :(得分:-2)

您可以使用jQuery

轻松完成
$("*").each(function(index, elem){
    if($(this).offset().left > 10){
        // do something here with $(this)
    }
});