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 :
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() .