Ответ 1
Все ответы верны, но я хочу заявить, что никто другой не сделал.
Метод jQuery data
действует как средство получения атрибутов данных html5, но средство установки не изменяет атрибут data- *.
Итак, если вы добавили данные вручную (как указано в вашем комментарии), то вы можете использовать селектор атрибутов css для выбора вашего элемента:
$('#element[data-data1=1]')
но если вы добавили (изменили) данные с помощью jQuery, то вышеуказанное решение не будет работать.
Вот пример этой ошибки:
var div = $('<div />').data('key','value');
alert(div.data('key') == div.attr('data-key'));// it will be false
Поэтому обходной путь - отфильтровать коллекцию, проверив значение данных jQuery на соответствие желаемому:
// replace key & value with own strings
$('selector').filter(function(i, el){
return $(this).data('key') == 'value';
});
Итак, чтобы преодолеть эти проблемы, вам нужно использовать атрибуты набора данных html5 (с помощью методов jQuery attr
) в качестве методов получения и установки:
$('selector').attr('data-' + key, value);
или вы можете использовать пользовательское выражение, которое фильтрует внутренний jQuery data
:
$.expr[':'].data = function(elem, index, m) {
// Remove ":data(" and the trailing ")" from the match, as these parts aren't needed:
m[0] = m[0].replace(/:data\(|\)$/g, '');
var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'),
// Retrieve data key:
key = regex.exec( m[0] )[2],
// Retrieve data value to test against:
val = regex.exec( m[0] );
if (val) {
val = val[2];
}
// If a value was passed then we test for it, otherwise we test that the value evaluates to true:
return val ? $(elem).data(key) == val : !!$(elem).data(key);
};
и используйте его как:
$('selector:data(key,value)')
Обновление
Я знаю, что этой теме уже несколько лет, но, поскольку она имеет определенную активность, стоит упомянуть, что сделать это с помощью querySelector
dom API (без необходимости в jQuery) довольно тривиально:
document.querySelectorAll('[attribute=value]')