Мне нужно выбрать элементы на основе значений, хранящихся в .data()
объекте элемента . Как минимум, я хотел бы выбрать свойства данных верхнего уровня с помощью селекторов, возможно, так:
$('a').data("category","music");
$('a:data(category=music)');
Или, возможно, селектор будет в обычном формате селектора атрибутов:
$('a[category=music]');
Или в формате атрибута, но с указателем, указывающим, что он находится в .data()
:
$('a[:category=music]');
Я обнаружил, что реализация Джеймса Падолси выглядит просто, но хорошо. Селекторные форматы выше методов зеркала показаны на этой странице. Есть также этот патч Sizzle .
По какой-то причине я вспоминаю, как читал некоторое время назад, что jQuery 1.4 будет включать поддержку селекторов для значений в jquery. .data()
объекте . Однако теперь, когда я ищу это, я не могу найти это. Может быть, это был просто запрос функции, который я видел. Есть ли поддержка для этого, и я просто не вижу этого?
В идеале, я хотел бы поддерживать под-свойства в data () с использованием точечной нотации. Как это:
$('a').data("user",{name: {first:"Tom",last:"Smith"},username: "tomsmith"});
$('a[:user.name.first=Tom]');
Я также хотел бы поддерживать несколько селекторов данных, где находятся только элементы со ВСЕМИ указанными селекторами данных. Обычный множественный селектор jquery выполняет операцию ИЛИ. Например, $('a.big, a.small')
выбирает a
теги с классом big
или small
). Я ищу AND, возможно, вот так:
$('a').data("artist",{id: 3281, name: "Madonna"});
$('a').data("category","music");
$('a[:category=music && :artist.name=Madonna]');
Наконец, было бы здорово, если бы на селекторах данных были доступны операторы сравнения и функции регулярных выражений. Так $(a[:artist.id>5000])
было бы возможно. Я понимаю, что, вероятно, смогу сделать многое из этого, используяfilter()
, но было бы неплохо иметь простой формат селектора.
Какие решения доступны для этого? Является ли Jame's Padolsey лучшим решением на данный момент? В первую очередь меня беспокоит производительность, а также дополнительные функции, такие как точечная нотация под-свойства и несколько селекторов данных. Существуют ли другие реализации, которые поддерживают эти вещи или лучше в некотором роде?
источник
Ответы:
Я создал новый
data
селектор, который должен позволить вам выполнять вложенные запросы и условия AND. Использование:Шаблон является:
«оператор» и «проверка» не являются обязательными. Таким образом, если у вас есть только
:data(a.b.c)
это будет просто проверить на truthiness изa.b.c
.Вы можете увидеть доступные операторы в коде ниже. Среди них есть
~=
возможность тестирования регулярных выражений:Я проверил это с несколькими вариантами, и это, кажется, работает довольно хорошо. Я, вероятно, скоро добавлю это как репозиторий Github (с полным набором тестов), так что следите!
Код:
источник
$("a:data(condition),a:data(orCondition)")
... это будет иметь тот же эффект. Чем больше функций вы добавите, тем медленнее будет. Если логика сложная, то используйте$(foo).filter(function(){...})
.jQuery.data
, который не получает данные, определенные в атрибутах HTML5. Если вы хотите эту функциональность, вы можете перейтиjQuery.data
на$('selector').data
, но это компромисс для скорости.На данный момент я выбираю так:
Кажется, что это прекрасно работает, но было бы неплохо, если бы jQuery мог выбирать по этому атрибуту без префикса «data-».
Я не проверял это с данными, добавляемыми к элементам через jQuery динамически, так что это может привести к падению этого метода.
источник
Вы также можете использовать простую функцию фильтрации без каких-либо плагинов. Это не совсем то, что вы хотите, но результат тот же:
источник
filter
функция обхода может принять тестовую функцию =) спасибоЯ хочу предупредить вас, что
$('a[data-attribute=true]')
, согласно ответу Эшли это не работает, если вы прикрепили данные к элементу DOM через функцию data ().Он работает так, как вы ожидаете, если вы добавите фактический data-attr в ваш HTML, но jQuery сохраняет данные в памяти, поэтому результаты, которые вы получите
$('a[data-attribute=true]')
, будут неверными.Вам нужно будет использовать плагин данных http://code.google.com/p/jquerypluginsblog/ , использовать
filter
решение Дмитрия или выполнить $ .each для всех элементов и многократно проверять .data ().источник
Есть
:data()
плагин фильтра, который делает именно это :)Некоторые примеры, основанные на вашем вопросе:
Производительность не будет чрезвычайно высокой по сравнению с тем, что возможно , выбор
$._cache
и захват соответствующих элементов - безусловно самый быстрый, но гораздо более округлый и не очень «jQuery-эй» с точки зрения того, как вы добираетесь до вещи (вы обычно входите со стороны элемента). Что касается моей головы, я не уверен, что в любом случае это самый быстрый процесс, поскольку процесс перехода от уникального идентификатора к элементу запутан сам по себе с точки зрения производительности.Упомянутый вами селектор сравнения будет лучше всего сделать в a
.filter()
, в плагине нет встроенной поддержки для этого, хотя вы можете добавить его без особых проблем.источник
data-*
атрибутов HTML5 и их выбор будет быстрее, чем выбор по.data()
свойствам? Кроме того, есть идеи, где я могу узнать больше о кэше $ ._? Я гуглил за это, но особо ничего не нахожу.$.cache
не так$._cache
, вы можете увидеть, как он реализован и используется в ядре jQuery, здесь: github.com/jquery/jquery/blob/master/src/data.js#L4 Когда вы вызываете,.data()
он фактически хранит его как объект in$.cache[elementUniqueID]
, который является идентификатором, назначаемым при необходимости инкриминирующим образом каждому элементу, например, 1, 2, 3 и т. д. Этот идентификатор набора будет отображаться в jQuery 1.4.3. Я полагаю, основываясь на комментариях git на днях. Я бы предположил, что маршрут HTML 5 будет быстрее, зависит от того, какие браузерные оптимизации доступны (я уверен, что больше будет доступно).Вы можете установить
data-*
атрибут вяза, используяattr()
, а затем выбрать, используя этот атрибут:и теперь для этого ильма, так
attr()
иdata()
дадут 123 :Однако, если вы измените значение на 456 с помощью
attr()
,data()
все равно будет 123 :Итак, насколько я понимаю, кажется, что вы, вероятно, должны избегать смешения
attr()
иdata()
команд в своем коде, если вам не нужно. Потому что,attr()
похоже, напрямую соответствует DOM, тогда какdata()
взаимодействует с «памятью», хотя его начальное значение может быть из DOM. Но ключевой момент заключается в том, что они вовсе не обязательно синхронизированы.Так что просто будь осторожен.
В любом случае, если вы не меняете
data-*
атрибут в DOM или в памяти, у вас не возникнет проблем. Как только вы начнете изменять значения, это может привести к возникновению потенциальных проблем.Спасибо @Clarence Liu на ответ @ Ash, а также на этот пост .
источник
Оно работает. См. Атрибут Равный Выбор [name = ”value”] .
источник
Если вы также используете jQueryUI, вы получаете (простую) версию
:data
селектора, которая проверяет наличие элемента данных, поэтому вы можете сделать что-то вроде$("div:data(view)")
или$( this ).closest(":data(view)")
.Смотрите http://api.jqueryui.com/data-selector/ . Я не знаю, как долго у них это было, но оно есть сейчас!
источник
Вот плагин, который упрощает жизнь https://github.com/rootical/jQueryDataSelector
Используйте это так:
источник