代码之家  ›  专栏  ›  技术社区  ›  Sebastian Rittau

jquery属性选择器:如何查询具有自定义命名空间的属性

  •  34
  • Sebastian Rittau  · 技术社区  · 16 年前

    假设我有一个简单的XHTML文档,它为属性使用自定义命名空间:

    <html xmlns="..." xmlns:custom="http://www.example.com/ns">
        ...
        <div class="foo" custom:attr="bla"/>
        ...
    </html>
    

    如何使用jquery匹配具有特定自定义属性的每个元素?使用

    $("div[custom:attr]")
    

    不起作用。(到目前为止,仅在Firefox上尝试过。)

    5 回复  |  直到 16 年前
        1
  •  42
  •   Aliaksandr Sushkevich    6 年前

    jQuery 不直接支持自定义命名空间,但可以使用筛选函数查找要查找的div。

    // find all divs that have custom:attr
    $('div').filter(function() { return $(this).attr('custom:attr'); }).each(function() {
      // matched a div with custom::attr
      $(this).html('I was found.');
    });
    
        2
  •  19
  •   Fyrd    14 年前

    这在某些情况下有效:

    $("div[custom\\:attr]")

    但是,有关更高级的方法,请参见 this XML Namespace jQuery plug-in

        3
  •  7
  •   Aliaksandr Sushkevich    6 年前

    按属性匹配的语法为:

    $("div[customattr=bla]") 比赛 div customattr="bla"

    $("[customattr]") 将所有标记与属性匹配 "customattr"

    具有类似的命名空间属性 'custom:attr' 不工作

    Here 你可以找到一个很好的概述。

        4
  •  3
  •   Božo Stojković    6 年前

    你应该使用 $('div').attr('custom:attr') .

        5
  •  2
  •   Katie Kilian Fenton    12 年前

    下面是一个对我有用的自定义选择器的实现。

    // Custom jQuery selector to select on custom namespaced attributes
    $.expr[':'].nsAttr = function(obj, index, meta, stack) {
    
        // if the parameter isn't a string, the selector is invalid, 
        // so always return false.
        if ( typeof meta[3] != 'string' )
            return false;
    
        // if the parameter doesn't have an '=' character in it, 
        // assume it is an attribute name with no value, 
        // and match all elements that have only that attribute name.
        if ( meta[3].indexOf('=') == -1 )
        {
            var val = $(obj).attr(meta[3]);
            return (typeof val !== 'undefined' && val !== false);
        }
        // if the parameter does contain an '=' character, 
        // we should only match elements that have an attribute 
        // with a matching name and value.
        else
        {
            // split the parameter into name/value pairs
            var arr = meta[3].split('=', 2);
            var attrName  = arr[0];
            var attrValue = arr[1];
    
            // if the current object has an attribute matching the specified 
            // name & value, include it in our selection.
            return ( $(obj).attr(attrName) == attrValue );
        }
    };
    

    示例用法:

    // Show all divs where the custom attribute matches both name and value.
    $('div:nsAttr(MyNameSpace:customAttr=someValue)').show();
    
    // Show all divs that have the custom attribute, regardless of its value.
    $('div:nsAttr(MyNameSpace:customAttr)').show();