2009-04-21 3 views
23

Можно ли выполнить цикл через объект data()?jQuery loop through data() object

Пусть это мой код:

$('#mydiv').data('bar','lorem'); 
$('#mydiv').data('foo','ipsum'); 
$('#mydiv').data('cam','dolores'); 

Как я цикл через это? Можно использовать each()?

ответ

14

JQuery хранит всю информацию, данные во внутренней переменной jQuery.cache. Можно получить все данные, связанные с конкретным объектом с этим простым, но полезным плагиным:

jQuery.fn.allData = function() { 
    var intID = jQuery.data(this.get(0)); 
    return(jQuery.cache[intID]); 
}; 

С этим на месте, вы можете сделать это:

$('#myelement').data('test1','yay1') 
       .data('test2','yay2') 
       .data('test3','yay3'); 

$.each($('#myelement').allData(), function(key, value) { 
    alert(key + "=" + value); 
}); 

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

+0

Если это внутренняя переменная, не подлежат изменению в более поздних версиях jquery (возможно, без предупреждения)? –

+0

Я уверен, что они могли, но я не уверен, почему они это сделают. Любое переоборудование, которое они могут выполнять с функциональностью данных, вероятно, будет включать эту функциональность, встроенную в любом случае. Я не думаю, что это действительно обоснованная причина уклоняться от этого, но я думаю, что это важно иметь в виду. –

9

Я не думаю, что существует какая-либо функция, которая дает вам все «ключи» данных, которые были добавлены функцией data(), но вместо этого почему бы не поместить все ваши данные в функцию под объект/карта?

что-то вроде этого:

var container = new Object(); 
container.bar = "lorem"; 
container.foo = "ipsum"; 
container.cam = "dolores"; 
$("mydiv").data("container", container); 

, а затем, когда вы хотите, чтобы прочитать данные/итерацию через него:

var blah = $("mydiv").data("container"); 
for(key in blah) { 
    var value = blah[key]; 
    //do whatever you want with the data, such as: 
    console.log("The value of ", key, " is ", value); 
} 
17
$.each($.data(this), function(i, e) { 
    alert('name='+ i + ' value=' +e); 
}); 

Это будет проходить через каждое свойство в объекте данных этого элемента.

+0

Это не сработало для OOTB, мне пришлось слегка изменить его: '$ .each ($ ('# mydiv'). Data(), function (i, e) {alert (i +": "+ e);}); – saluce

9

Испытано с JQuery 1.4 и советы от @ user292614 следующих работ:

$('#mydiv').data('bar','lorem'); 
$('#mydiv').data('foo','ipsum'); 
$('#mydiv').data('cam','dolores'); 

$.each($('#mydiv').data(),function(i, e) { 
    alert('name='+ i + ' value=' +e); 
}); 
0

Я просто попытался это, но необходимы некоторые дополнительные значения данных. Если вы также получили эту «проблему», тогда должно работать следующее.

$('#mydiv').data('bar', {name:'lorem', id:'156', price:'199'}); 

, то вы можете просто расширить со значением идентификатора

$.each($('#mydiv').data(),function(i, e) { 
    alert('name='+ i + ' name=' +e.name + ' id='e.id + ' price=' + e.price); 
}); 
0

Если мы используем .data() означает, что хранить произвольные данные, связанные с соответствием элементов или возвращает значение в указанном хранилище данных для первый элемент в наборе согласованных элементов.

и если .data() в цикле, поэтому мы должны получить доступ к этому же образом, в цикле, так, например, для (ниже)

<p class="weekday" data-today="monday">Monday</p> 
<p class="weekday" data-today="tuesday">Tuesday</p> 
<p class="weekday" data-today="wednesday">Wednesday</p> 
<p class="weekday" data-today="thursday">Thursday</p> 

HTML, в моем цикле и data-today является одинаковым во всех тегах, но их значения отличаются друг от друга, поэтому в основном это сгенерированный цикл html, поэтому мы должны получить доступ таким же образом, например, loop в js/jQuery, например(below jQuery code)

$('.weekday').each(function(){ $(this).data('today'); });

OutPut :

Monday 
Tuesday 
Wednesday 
Thursday 

ПРИМЕЧАНИЕ: В консоли браузера это вернуть конкретный <DIV>.