Aparentemente un <input>
evento deshabilitado no es manejado por ningún evento
¿Hay alguna forma de solucionar este problema?
<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
$(this).removeAttr('disabled');
})
Aquí, necesito hacer clic en la entrada para habilitarla. Pero si no lo activo, la entrada no debería publicarse.
javascript
jquery
html
Pierre de LESPINAY
fuente
fuente
Respuestas:
Los elementos deshabilitados no disparan eventos del mouse. La mayoría de los navegadores propagarán un evento que se origina desde el elemento deshabilitado hasta el árbol DOM, por lo que los controladores de eventos podrían ubicarse en elementos del contenedor. Sin embargo, Firefox no exhibe este comportamiento, simplemente no hace nada cuando hace clic en un elemento deshabilitado.
No puedo pensar en una solución mejor, pero, para una compatibilidad cruzada completa del navegador, podría colocar un elemento delante de la entrada deshabilitada y hacer clic en ese elemento. Aquí hay un ejemplo de lo que quiero decir:
jq:
Ejemplo: http://jsfiddle.net/RXqAm/170/ (actualizado para usar jQuery 1.7 con en
prop
lugar deattr
).fuente
disabled
atributo sin valor, eso implica HTML en lugar de XHTML, en cuyo caso la barra diagonal de cierre es innecesaria.mouseenter
, Etc.)input[disabled] {pointer-events:none}
su CSS. Luego, el clic se comporta como si hubiera hecho clic en el elemento primario. En mi humilde opinión, esta es la solución más simple y limpia, pero desafortunadamente solo funciona para los navegadores que admiten lapointer-events
propiedad CSS: caniuse.com/#search=pointer-eventsTal vez podría hacer que el campo sea de solo lectura y al enviarlo deshabilite todos los campos de solo lectura
y la entrada (+ script) debe ser
fuente
Los elementos deshabilitados "comen" clics en algunos navegadores: no responden a ellos ni permiten que sean capturados por los controladores de eventos en cualquier parte del elemento o cualquiera de sus contenedores.
En mi humilde opinión, la forma más simple y limpia de "arreglar" esto (si realmente necesita capturar clics en elementos deshabilitados como lo hace el OP) es simplemente agregar el siguiente CSS a su página:
Esto hará que cualquier clic en una entrada deshabilitada caiga al elemento principal, donde puede capturarlos normalmente. (Si tiene varias entradas deshabilitadas, es posible que desee colocar cada una en un contenedor individual, si aún no se han presentado de esa manera, un extra
<span>
o un<div>
, por ejemplo, solo para que sea fácil distinguir qué entrada deshabilitada fue hecho clic).La desventaja es que este truco desafortunadamente no funcionará para los navegadores más antiguos que no admiten la
pointer-events
propiedad CSS. (Debería funcionar desde IE 11, FF v3.6, Chrome v4): caniuse.com/#search=pointer-eventsSi necesita admitir navegadores antiguos, deberá usar una de las otras respuestas.
fuente
input[disabled]
también coincidiría con elementos deshabilitados por JavaScript (element.disabled = true;
), pero parece que sí. De todos modos, me pareceinput:disabled
más limpio.Sugeriría una alternativa: use CSS:
en lugar del atributo deshabilitado. Luego, puede agregar sus propios atributos CSS para simular una entrada deshabilitada, pero con más control.
fuente
fuente
En lugar de
disabled
, podría considerar usarreadonly
. Con un poco de CSS adicional, puede diseñar la entrada para que se vea como undisabled
campo.En realidad hay otro problema. El evento
change
solo se dispara cuando el elemento pierde el foco, lo que no es lógico considerando undisabled
campo. Probablemente esté enviando datos a este campo desde otra llamada. Para que esto funcione, puede usar el evento 'bind'.fuente
¡O haga esto con jQuery y CSS!
De esta manera, hace que el elemento se vea deshabilitado y no se dispararán eventos de puntero, sin embargo, permite la propagación y, si se envía, puede usar el atributo 'ignorar' para ignorarlo.
fuente
Hoy tuvimos un problema como este, pero no queríamos cambiar el HTML. Así que utilizamos el evento mouseenter para lograr eso
fuente
Encuentro otra solución:
La clase "deshabilitado" imita el elemento deshabilitado por opacidad:
Y luego cancele el evento si el elemento está deshabilitado y elimine la clase:
fuente
La sugerencia aquí parece un buen candidato para esta pregunta también
¿Realizar evento de clic en un elemento deshabilitado? Javascript jQuery
fuente