Селекторы атрибутов jQuery: как запросить атрибут с настраиваемым пространством имен

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

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

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

$("div[custom:attr]")

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

Обновление, ответ Суфи - гораздо более простой синтаксис и работает. Однако я не делал никаких сравнений производительности.

Nathan Koop 22.02.2012 19:01

Предполагается, что объявление префикса пространства имен должно быть xmlns: custom =?

grantwparks 06.05.2012 03:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
34
2
70 233
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вам следует использовать $('div').attr('custom:attr').

Я пояснил свой вопрос: я хочу сопоставить каждый элемент с настраиваемым атрибутом, а не получать значение атрибута.

Sebastian Rittau 18.09.2008 15:24

@redsquare: работает в большинстве браузеров, но не работает в Opera. Какое-нибудь быстрое решение для этого?

Gapipro 21.10.2011 12:30
Ответ принят как подходящий

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.');
});

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

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

Однако для более продвинутого метода см. этот подключаемый модуль jQuery пространства имен XML

Плагин пространства имен - это мечта.

user166390 06.05.2010 10:27

Эта стратегия не работает в браузерах на основе Webkit, таких как Safari и Chrome. Любая идея?

kaychaks 29.01.2011 15:45

+1, с небольшим примечанием: jQuery будет стирать определения пространств имен добавленных фрагментов XML в HTML (на самом деле, проверено с SVG). Он изменяет атрибуты xmlns:custom = "uri" на custom = "uri", вероятно, потому, что HTML (обычно?) Не подтверждает атрибут xmlns. Использование документа в формате XHTML решает проблему, хотя не во всех случаях может быть практичным.

Courtney Christensen 28.09.2011 19:27

По моему опыту, обычно сам браузер отвечает за изменение HTML (поскольку он управляет DOM, а не jQuery). IE особенно ужасен по этому поводу (большой сюрприз).

JDB still remembers Monica 12.12.2012 19:59

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

$("div[customattr=bla]") соответствует div customattr = "bla"

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

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

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

В связанной статье не упоминаются настраиваемые атрибуты.

Charlie Schliesser 18.05.2012 19:52

Это не ответ. По сути, это просто повторение вопроса и утверждение, что селекторы, похоже, не работают с пространствами имен.

spaaarky21 06.02.2013 02:13

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

// 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();

Другие вопросы по теме