2009-06-17 11 views
103

Decir que tengo 4 elementos div con la clase .navlink, que, cuando se hace clic, utilice .data() para establecer una clave llamada 'selected', a un valor de true:elemento de filtro basado en .data()/valor

$('.navlink')click(function() { $(this).data('selected', true); }) 

Cada vez que se hace clic en un nuevo .navlink, me gustaría almacenar el navlink previamente seleccionado para su posterior manipulación. ¿Existe una manera rápida y fácil de seleccionar un elemento basado en lo que se almacenó usando .data()?

No parece haber ninguna jQuery : Filtros que se ajustaba perfectamente, y yo probamos el siguiente (dentro del mismo evento de clic), pero por alguna razón no funciona:

var $previous = $('.navlink').filter( 
    function() { $(this).data("selected") == true } 
); 

Sé que hay otras maneras de lograr esto, pero ahora estoy solo con curiosidad si se puede hacer a través del .data().

Respuesta

167

su filtro quiere trabajar, pero hay que volver true en objetos coincidentes en la función pasada al filtro para que los agarre.

var $previous = $('.navlink').filter(function() { 
    return $(this).data("selected") == true 
}); 
+16

es triste que no haya una forma más corta de hacerlo. muy desordenado. – vsync

+4

Tenga en cuenta que esto ya no es la única manera de hacerlo, StefanoP ha proporcionado alternativas –

+2

@NathanKoop, no del todo. Ver mi comentario sobre su respuesta. –

-1

Parece más trabajo de lo que vale.

1) ¿Por qué no tener una sola variable de JavaScript que almacena una referencia al objeto element \ jQuery seleccionado actualmente?

2) ¿Por qué no agregar una clase al elemento seleccionado actualmente? Entonces podrías consultar el DOM para la clase ".active" o algo así.

+0

Sí, pero como he dicho, yo sabía que había otras maneras de lograrlo. Estaba atascado sobre si se podía filtrar a través de data() y por qué filter() no me funcionaba. Gracias sin embargo. – user113716

+0

Lo siento. Me perdí esa parte de tu pregunta. –

8

Dos cosas que noté (pueden ser errores de cuando la escribiste).

  1. se ha perdido un punto en el primer ejemplo ($('.navlink').click)
  2. Para el filtro funcione, usted tiene que devolver un valor (return $(this).data("selected")==true)
116

Sólo para que conste, que puede filtro en los datos con jQuery (esta pregunta es bastante antiguo, y jQuery evolucionado desde entonces, por lo que es adecuada para escribir esta solución también):

$('.navlink[data-selected="true"]'); 

o, mejor (para un rendimiento):

$('.navlink').filter('[data-selected="true"]'); 

o, si desea obtener todos los elementos con data-selected conjunto:

$('[data-selected]') 

Nota que este método sólo funciona con datos que se establecieron a través de HTML-atributos. Si configura o cambia los datos con la llamada .data(), este método ya no funcionará.

+9

si el conteo de votos bajo para esta respuesta lo asusta, es la respuesta aceptada con Más de 100 votos para una pregunta prácticamente idéntica http://stackoverflow.com/questions/4146502 –

+40

-1 Esto no funciona cuando los datos se configuran con el método '.data()' en lugar de un atributo 'data-'. Vea este violín: http://jsfiddle.net/bryandowning/tySWC/ - Además, el método '.find()' busca hijos del selector anterior. En el ejemplo dado, 'data-selected' es un atributo de' .navlink', no un hijo de '.navlink'. Además, '$ ('div p')' y '$ ('div'). Find ('p')' son esencialmente equivalentes. Usar '.find()' parece que puede ser más lento debido a la llamada de función adicional (aunque no estoy seguro de esto). Por favor, corrígeme si me equivoco sobre algo de esto (realmente me gustaría que este método funcionara). –

+3

un par de cosas: 1) tienes razón en que esto no funciona si estableces datos con '.data()', ya que jQuery busca a través del DOM, lo publiqué para aquellos (como yo) que llegaron a este pregunta por otros motivos; 2) corregir, '.find()' busca entre los hijos, por lo que está mal en este ejemplo; 3) estás equivocado, no son equivalentes, como jQuery busca de derecha a izquierda, mira http://jonraasch.com/blog/10-advanced-jquery-performance-tuning-tips-from-paul-irish – StefanoP

12

podemos hacer una función muy fácilmente:

$.fn.filterData = function(key, value) { 
    return this.filter(function() { 
     return $(this).data(key) == value; 
    }); 
}; 

Uso (comprobación de un botón de radio):

$('input[name=location_id]').filterData('my-data','data-val').prop('checked',true); 
Cuestiones relacionadas