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