Jquery виділяє всі елементи, які мають $ jquery.data ()


Відповіді:


98

Ви могли б це зробити

$('[data-myAttr!=""]'); 

це вибирає всі елементи, які мають атрибут, data-myAttrякий не дорівнює '' (тому він повинен бути встановлений);

Ви також можете використовувати filter ()

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

67
Або просто:$('[data-myAttr]')
andlrc

4
Думав те саме. Це не працює, як очікувалося. дивись цю ДЕМО
gdoron підтримує Моніку

у першій частині коду відсутнє закриття '(неможливо відредагувати відповідь безпосередньо)
Florent2

1
$ ('[data-myAttr! = ""]'); поверне елементи, яким це не призначено. Коментар @NULL отримує лише елементи, для яких він встановлений.
arleslie

6
НЕ ПРАВО! правильне рішення: $ ('[data-myAttr]') - дивіться відповідь нижче для пояснення
BassMHL

74

Найкращий і простий спосіб їх вибрати:

$('[data-myAttr]')

Більше інформації:

Я тестував багато речей.

Використання $('[data-myAttr!=""]')працює не у всіх випадках. Оскільки елементи, які не мають data-myAttrнабору, матимуть їх data-myAttrрівними undefinedі також $('[data-myAttr!=""]')будуть вибирати ті, що є неправильним.


3
Це працює лише з атрибутами даних, визначеними у розмітці. Він НЕ працює з атрибутами даних, визначеними за допомогою jQuery, див. Jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

Ви можете використовувати filter () :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});


1
Чому селектор атрибутів не виконує цю роботу? $('[data-myAttr]')?
gdoron підтримує Моніку

6
@gdoron, це тому, що data()'getter' форма справді читає data-атрибути HTML5 , але форма її setter ні створює, ні оновлює їх.
Фредерік Хаміді

мммм, так де це зберігає дані? Ви можете дати мою посилання? Я прочитав це "(усі значення даних потім зберігаються внутрішньо в jQuery)." але де???
gdoron підтримує Моніку

3
@gdoron, дані зберігаються в глобальному кеші, за допомогою ідентифікатора, який пов'язаний з елементом через властивість extendo.
Фредерік Хаміді

17

Ви можете використовувати це розширення jQuery Selector: Запит даних елемента

$(':data');       // All elements with data  
$(':not(:data)'); // All elements without data

У користувальницькому інтерфейсі jQuery це вже є, тому деяким може не знадобитися викликати анонімну функцію. api.jqueryui.com/data-selector
arleslie

7

Ви можете використовувати інтерфейс користувача JQuery з селектором: data ()

Вибирає елементи, які містять дані, що зберігаються під вказаним ключем.

Перевірте цей jsfiddle для прикладу

Для отримання відповідності всіх елементів .data('myAttr')ви можете використовувати

var matches = $(':data(myAttr)');

Це повинно працювати для обох елементів з data-атрибутами та елементами з даними , збереженими з використанням , $.data()тому що

З jQuery 1.4.3 атрибути даних HTML 5 автоматично втягуються в об'єкт даних jQuery.

Але це працює не дуже добре. Перевірте цей jsfiddle, і ви побачите, що вдруге, коли селектор викликається, він повинен відповідати 2 елементам і відповідає лише одному. Це пов'язано з "помилкою" в бібліотеці jquery-ui.

Це взято з основного файлу jquery-ui.

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

Як бачите, вони використовують $.data(elem, match)замість цього, $(elem).data(match)що призводить до того, що кеш не оновлюється, якщо ви запитуєте елементи з data-атрибутами. Якщо елемент протестовано для data()зберігання, це працює добре, але якщо ні, то він не буде включений в отримані збіги.

Можливо, це зовсім не помилка, якщо те, що ви хочете, це відповідати лише елементам із заданою вами інформацією про дані, але якщо ні, то вам залишаються два варіанти.

  1. Не використовуйте jquery-ui та не розширюйте власний псевдоселектор $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });

  2. Використовуйте jquery-ui з :dataпсевдоселектором і приєднуйтесь до результатів вибору, [data-myAttr]щоб включити ті, які можна пропустити

    var matches = $(':data(myAttr)', '[data-myAttr]')


Це було частиною рішення моєї проблеми вибору елементів з атрибутами data- *, не знаючи фактичного ідентифікатора або імені атрибута даних. Я знайшов спосіб розширити jQuery для цього в іншому місці, але +1 тут, щоб фрагмент коду показав практичне застосування. Інші дають достатньо, щоб натякнути, але іноді потрібно ПОКАЗАТИ, як ВИКОРИСТОВУВАТИ надану інформацію. Дякую! :)
Брендон Елліотт

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

Виберіть елементи, які я раніше встановлював jquery.data();


Питання в тому, щоб знайти всі елементи з певним ключем, а не будь-якими даними.


Спробуйте використати jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


Дякую за відповідь. Питання полягає в тому, щоб знайти всі елементи з певним ключем, а не будь-якими даними.
Аргіропулос Ставрос

@ArgiropoulosStavros Чи є вимога повертати елементи, що мають html data-*набір атрибутів, а також jQuery.data()набір?
guest271314
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.