2009-04-21 10 views
23

¿Es posible recorrer un objeto data()?jQuery loop through data() objeto

Supongamos que este es mi código:

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

¿Cómo puedo bucle a través de esto? ¿Se puede usar each() para esto?

Respuesta

14

tiendas jQuery toda la información de datos en la variable interna jQuery.cache. Es posible obtener todos los datos asociados a un objeto en particular con esta sencilla pero útil plugin:

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

Con esto en su lugar, usted puede hacer esto:

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

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

es posible que utilices Matt B de sugerencia, pero esta es la forma de hacerlo con lo que tienes ahora.

+0

Si se trata de una variable interna, ¿no está sujeto a cambios en las versiones posteriores de jquery (probablemente sin previo aviso)? –

+0

Estoy seguro de que podrían, pero no estoy seguro de por qué lo harían. Cualquier modificación que pudieran hacer a la funcionalidad de datos probablemente incluiría esta funcionalidad incorporada de todos modos. No creo que sea realmente una razón válida para evitarlo, pero creo que es una preocupación a tener en cuenta. –

9

No creo que haya ninguna función que le proporcione todas las "claves" de los datos que se han agregado con la función data(), pero en su lugar, ¿por qué no poner todos sus datos en la función bajo un objeto/mapa?

algo como esto:

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

y luego cuando se desea leer los datos/iterar a través de él:

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); 
}); 

Esto iterará a través de cada propiedad en el objeto de datos del elemento 'this'.

+0

Esto no funcionó OOTB para mí, tuve que modificarlo ligeramente: '$ .each ($ ('# mydiv'). Data(), función (i, e) {alerta (i +": "+ e);}); ' – saluce

9

probado con jQuery 1.4 y consejos de @ user292614 las siguientes obras:

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

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

Acabo de intentar esto, pero necesita algunos valores de datos adicionales. Si también tienes este "problema", entonces lo siguiente debería funcionar.

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

, entonces solo puede extender con el valor id

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

Si utilizamos .data() significa que almacenar datos arbitrarios asociados con los elementos coincidentes o devolver el valor en el almacén de datos el nombre de el primer elemento en el conjunto de elementos combinados.

y si .data() en el bucle de modo que tienen para acceder a ella misma manera en bucle así que por ejemplo (abajo)

<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> 

El html en mi bucle y data-today es igual en todas las etiquetas, pero sus valores son diferentes, así que básicamente se genera en el bucle html, así que tenemos que acceder de la misma manera, es decir, bucle en js/jQuery por ejemplo(below jQuery code)

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

OutPut :

Monday 
Tuesday 
Wednesday 
Thursday 

NOTA: En la consola del navegador que vuelva particular, <DIV>.