javascript jquery html jquery-1.9

javascript - jQuery 1.9.1 selector de propiedades



jquery selector (3)

Me encontré con esto y solo quería publicar otra solución que encontré que funciona en algunas situaciones donde algunas de las otras soluciones sugeridas no son apropiadas.

Simplemente agregue este controlador de eventos a su código

$(''input'').on(''keyup'', function(){ var value = $(this).val(); $(this).attr(''value'', value); });

Fondo

A partir de jQuery 1.9, el .attr(..) ya no devuelve valores de propiedad, en su lugar, ahora tenemos que usar .prop(..) . Desafortunadamente, esto también se aplica a los atributos especificados a través de un selector de atributos, es decir, $("input[value=]")

Consulte http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

y una buena discusión de SO sobre las diferencias entre .attr y .prop :

.prop () vs .attr ()

Mi situación

Actualmente estoy usando selectores como $("input[value=]") y $("select[value=]") para seleccionar elementos de entrada que no tienen un valor establecido. Sin embargo, esto ya no funciona con jQuery 1.9, en cambio ahora estoy haciendo algo como esto:

var hasValue = function () { return !!($(this).val().length); }; var hasNoValue = function () { return !($(this).val().length); }; $("input").filter(hasValue); $("select").filter(hasValue);

Mis selectores reales son un poco más grandes, verificando múltiples elementos con o sin valores, por lo que ahora tengo que dividir mi cadena de selector 1 en múltiples selectores con el método .filter (..).

Pregunta

¿Hay un equivalente a $("[value=]") , $("[value!=]") , $("[value=''abc'']") que usa la propiedad en lugar del atributo? Y si no, ¿hay una manera más limpia que usar los .filter(hasValue) y .filter(hasNoValue) ?

Gracias


Según la http://jquery.com/upgrade-guide/1.9/#attr-versus-prop- :

Sin embargo, cuando se usa un selector como "entrada [valor = abc]", siempre debe seleccionar el atributo del valor y no cualquier cambio realizado en la propiedad por el usuario, por ejemplo, a partir de que escriba en una entrada de texto. A partir de jQuery 1.9, esto se comporta de manera correcta y consistente. Las versiones anteriores de jQuery a veces usarían la propiedad cuando deberían haber usado el atributo.

Entonces, esto responde a su primera pregunta: no hay un equivalente directo, el punto es usar el atributo en lugar de la propiedad.

Su código parece estar bien, pero si desea ser más estandarizado y reutilizable, puede crear un filtro adicional. Al igual que:

(function($) { $.expr['':''].hasValue = function(element) { var $element = $(element); return element.is('':input'') && element.val(); }; }(window.jQuery));

Esto te permitirá seleccionar cosas como esa:

// Select input elements with value and select elements without value. $(''input:hasValue,select:not(:hasValue)'');

Y otras combinaciones que necesites.


Usar .filter parece ser la única manera, pero no es tan malo y puedes hacerlo un poco más preciso usando .val :

$(":input").filter(function () { return $(this).val() === ""; });

Si esto es realmente reprensible para usted, podría crear un selector personalizado.

$.expr['':''].emptyInput = function (elem) { return $(elem).is(":input") && $(elem).val() === ""; };

http://jsfiddle.net/ExplosionPIlls/zaZPp/

EDITAR: También puede salirse con la this.value usando este this.value lugar de $(elem).val() .