Селекторы атрибутов jQuery: как запросить атрибут с пользовательским пространством имен - PullRequest
34 голосов
/ 18 сентября 2008

Предположим, у меня есть простой документ XHTML, который использует настраиваемое пространство имен для атрибутов:

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

Как мне сопоставить каждый элемент, имеющий определенный пользовательский атрибут, используя jQuery? Использование

$("div[custom:attr]")

не работает. (До сих пор пробовал только с Firefox.)

Ответы [ 5 ]

42 голосов
/ 18 сентября 2008

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.');
});
19 голосов
/ 02 февраля 2010

Это работает в некоторых условиях:

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

Однако, для более продвинутого метода, смотрите этот плагин jQuery пространства имен XML

7 голосов
/ 28 мая 2010

синтаксис для сопоставления по атрибуту:

$("div[customattr=bla]") совпадений div customattr="bla"

$("[customattr]") соответствует всем тегам с атрибутом "customattr"

с атрибутами пространства имен, такими как 'custom:attr', он не работает

Здесь Вы можете найти хороший обзор.

3 голосов
/ 18 сентября 2008

Вы должны использовать $('div').attr('custom:attr').

2 голосов
/ 04 апреля 2012

Вот реализация пользовательского селектора, который работает для меня.

// 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...