Как выбрать специальные атрибуты (префикс: name = "")? - PullRequest
3 голосов
/ 13 июня 2009

как выбрать специальные атрибуты, такие как 'user: name' или 'city: id', используя jQuery?

<div user:name="Ropstah"></div>
<span city:id="4"></div>

Javascript

//this works:
alert($('div').attr("user:name"));  // alerts 'Ropstah'

//this doesn't work:
alert($('div[user:name]').attr("user:name"));    //error
alert($('div[user\\:name]').attr("user:name"));    //error even with special character escaping...

Ответы [ 3 ]

4 голосов
/ 13 июня 2009

Это ошибка в jQuery .

У вас есть два варианта:

  • Избавьтесь от : и используйте «нестандартные» атрибуты (честно, это не имеет большого значения)
  • Получите больше подробностей или используйте плагин для получения функциональности в любом случае:

Первоначально вам, возможно, придется сделать следующее:

$('div').filter(function() {
    return $(this).attr('user:name') !== undefined;
}).whateverElse();

По скорости это должно быть довольно близко к селектору [] jQuery, так как это то, что он делает внутри библиотеки в любом случае. Конечно, каждый раз нужно набирать больше текста, когда вы хотите найти элемент с атрибутом, поэтому вы можете написать для него плагин, поскольку jQuery - это круто и позволяет вам делать такие вещи:

$.fn.hasattr = function(attr) {
    return this.filter(function() {
        return $(this).attr(attr) !== undefined;
    });
};

Что позволит вам сделать намного проще:

$('div').hasattr('user:name').whateverElse();

Или, если вы хотите проверить, равен ли атрибут чему-либо, плагин может быть:

$.fn.cmpattr = function(attr, value) {
    return this.filter(function() {
        return $(this).attr(attr) == value;
    });
};

И тогда вы могли бы сделать:

$('div').cmpattr('user:name', 'Ropstah').whateverElse();
3 голосов
/ 13 июня 2009

Исправьте это:

jQuery.expr.match.ATTR = /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+|\w+:\w+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/;
//                                                          ^^^^^^^^

РЕДАКТИРОВАТЬ : Это не официальное исправление, хотя оно работает довольно хорошо.

У меня было довольно много головных болей, вызванных jQuery и его внутренними действиями ... иногда, я думаю, можно застрять там и исправить это самостоятельно. :)

2 голосов
/ 13 июня 2009

Если вы в порядке с использованием нестандартных свойств (которые никак не влияют на визуализацию вашей разметки ... это довольно безопасно), вы можете сделать это:

<div nonstandard="harmless" />

$("div[nonstandard='harmless']")

Я использовал этот подход несколько раз. Быть прагматичным не помешает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...