Tengo un formulario de entrada que me permite seleccionar entre varias opciones y hacer algo cuando el usuario cambia la selección. P.ej,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Ahora, doSomething()
solo se activa cuando la selección cambia .
Quiero activar doSomething()
cuando el usuario selecciona cualquier opción, posiblemente la misma nuevamente.
He intentado usar un controlador "onClick", pero se activa antes de que el usuario comience el proceso de selección.
Entonces, ¿hay alguna manera de activar una función en cada selección del usuario?
Actualizar:
La respuesta sugerida por Darryl parecía funcionar, pero no funciona de manera consistente. A veces, el evento se activa tan pronto como el usuario hace clic en el menú desplegable, ¡incluso antes de que el usuario haya terminado el proceso de selección!
fuente
Respuestas:
Aquí está la forma más simple:
Funciona tanto con la selección del mouse como con las teclas arriba / abajo del teclado cuando la selección está enfocada.
fuente
undefined
todos modos.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
función no se activa cuando el usuario selecciona la opción ya seleccionada. Vea este plunk , donde el color de fondo solo cambia si selecciona una opción diferente a la seleccionada actualmente.doSomething()
cuando se selecciona una opción específica, por ejemplo, "opción 3" en el ejemplo anterior, useif (this.selectedIndex==4)
donde el número "4" representa el índice numérico de opciones, ¡NO el especificadovalue
! (es decir, "opción 3" es la cuarta opción de<select name="ab">
).Necesitaba algo exactamente igual. Esto es lo que funcionó para mí:
Soporta esto:
fuente
Tuve el mismo problema cuando estaba creando un diseño hace unos meses. La solución que encontré fue usar
.live("change", function())
en combinación con.blur()
el elemento que está usando.Si desea que haga algo cuando el usuario simplemente hace clic, en lugar de cambiar, simplemente reemplace
change
conclick
.Le asigné un ID a mi menú desplegable
selected
y utilicé lo siguiente:Vi que esta no tenía una respuesta seleccionada, así que pensé que daría mi opinión. Esto funcionó excelentemente para mí, así que espero que alguien más pueda usar este código cuando se atasque.
http://api.jquery.com/live/
Editar: use el
on
selector en lugar de.live
. Ver jQuery .on ()fuente
Solo una idea, pero ¿es posible poner un clic en cada uno de los
<option>
elementos?Otra opción podría ser usar onblur en la selección. Esto se activará cada vez que el usuario haga clic fuera de la selección. En este punto, podría determinar qué opción se seleccionó. Para que esto incluso se active en el momento correcto, el clic de las opciones podría desenfocar el campo (hacer que algo más esté activo o simplemente .blur () en jQuery).
fuente
El enfoque de onclick no es del todo malo, pero como se dijo, no se activará cuando el valor no se cambie con un clic del mouse.
Sin embargo, es posible activar el evento onclick en el evento onchange.
fuente
Vamos a ampliar la respuesta de jitbit. Me pareció extraño cuando hiciste clic en el menú desplegable y luego hiciste clic en el menú desplegable sin seleccionar nada. Terminé con algo parecido a:
Esto tiene un poco más de sentido para el usuario y permite que JavaScript se ejecute cada vez que selecciona cualquier opción, incluida una opción anterior.
La desventaja de este enfoque es que rompe la capacidad de tabular en un menú desplegable y usar las teclas de flecha para seleccionar el valor. Esto fue aceptable para mí, ya que todos los usuarios hacen clic en todo todo el tiempo hasta el final de la eternidad.
fuente
this
lugar de hacerlo$(this)
. Sin embargo, no obtengo todo el comportamiento previsto de esto; no alerta cuando vuelvo a seleccionar la misma opción.onchange
se activa al agregar opciones de eliminación a un cuadro de selección a través de JS. No solo cuando un usuario selecciona un elementoSi realmente necesita que esto funcione de esta manera, lo haría (para garantizar que funcione con el teclado y el mouse)
Desafortunadamente, el onclick se ejecutará varias veces (por ejemplo, al abrir la selección ... y al seleccionar / cerrar) y la pulsación de la tecla onkey puede activarse cuando nada cambia ...
fuente
Para disparar un evento correctamente cada vez que el usuario selecciona algo (incluso la misma opción), solo necesita engañar el cuadro de selección.
Como otros han dicho, especifique un
selectedIndex
enfoque negativo para forzar el evento de cambio. Si bien esto le permite engañar al cuadro de selección, no funcionará después de eso, siempre y cuando todavía tenga el foco. La solución simple es forzar el desenfoque del cuadro de selección, como se muestra a continuación.JS / HTML estándar:
Complemento jQuery:
Puedes ver una demostración funcional aquí .
fuente
En realidad, los eventos onclick NO se activarán cuando el usuario use el teclado para cambiar la selección en el control de selección. Es posible que deba usar una combinación de onChange y onClick para obtener el comportamiento que está buscando.
fuente
Es posible que esto no responda directamente a su pregunta, pero este problema podría resolverse mediante simples ajustes de nivel de diseño. Entiendo que esto puede no ser 100% aplicable a todos los casos de uso, pero le recomiendo que considere repensar el flujo de su aplicación por parte del usuario y si se puede implementar la siguiente sugerencia de diseño.
Decidí hacer algo simple que la piratería alternativas para
onChange()
el uso de otros eventos que no fueron realmente destinados para este propósito (blur
,click
, etc.)La forma en que lo resolví:
Simplemente coloque una etiqueta de opción de marcador de posición como select que no tiene valor
Entonces, en lugar de simplemente usar la siguiente estructura, que requiere alternativas de hack-y:
Considere usar esto:
Entonces, de esta manera, su código es MUCHO más simplificado y
onChange
funcionará como se espera, cada vez que el usuario decida seleccionar algo que no sea el valor predeterminado. Incluso podría agregar eldisabled
atributo a la primera opción si no desea que lo seleccionen nuevamente y obligarlos a seleccionar algo de las opciones, lo que desencadena unonChange()
incendio.En el momento de esta respuesta, estoy escribiendo una aplicación Vue compleja y descubrí que esta elección de diseño ha simplificado mucho mi código. Pasé horas en este problema antes de establecerme con esta solución y no tuve que volver a escribir mucho de mi código. Sin embargo, si optara por las alternativas hacky, habría tenido que tener en cuenta los casos límite, para evitar la doble activación de las solicitudes de ajax, etc. Esto tampoco estropea el comportamiento predeterminado del navegador como una buena ventaja (probado en dispositivos móviles navegadores también).
A veces, solo necesita dar un paso atrás y pensar en el panorama general para la solución más simple.
fuente
Lo que hice cuando me enfrenté a un problema similar es que agregué un 'onFocus' al cuadro de selección que agrega una nueva opción genérica ('seleccionar una opción' o algo similar) y lo predetermina como la opción seleccionada.
fuente
Así que mi objetivo era poder seleccionar el mismo valor varias veces, lo que esencialmente sobrescribe la función onchange () y convertirlo en un método útil onclick ().
Basado en las sugerencias anteriores, se me ocurrió esto que funciona para mí.
http://jsfiddle.net/dR9tH/19/
fuente
onfocus="this.selectedIndex=-1"
soluciones: la selección actual se ve afectada si toca el componente o si sale del menú sin seleccionar nada. Presiona tab en tu violín para ver a qué me refiero. (También observe que obtiene un valor en blanco y no '-' cuando hace esto. Esto se debe aselectedIndex=-1
que no lo consigue<option value="-1">
; sería una ligera mejora aquí para usaronfocus="this.selectedIndex=0"
. Esta es una solución medio decente, pero no lo hago como perder la selección actual sólo porque me asomé en el menú, o incluso sólo con pestañas a la misma.en primer lugar, usa onChange como controlador de eventos y luego usa la variable de marca para hacer que realice la función que desea cada vez que realiza un cambio
fuente
Agregue una opción adicional como la primera, como el encabezado de una columna, que será el valor predeterminado del botón desplegable antes de hacer clic y restablecer al final de
doSomething()
, de modo que cuando elija A / B / C, el evento onchange siempre se activa, cuando la selección esState
, no haga nada y regrese.onclick
es muy inestable como mucha gente mencionó antes. Entonces, todo lo que tenemos que hacer es crear una etiqueta de botón inicial que sea diferente como sus opciones verdaderas para que el cambio funcione en cualquier opción.fuente
Lo maravilloso de la etiqueta de selección (en este escenario) es que tomará su valor de las etiquetas de opción.
Tratar:
Funcionó decente para mí.
fuente
use jquery:
fuente
Aquí está mi solución, completamente diferente a cualquier otra aquí. Utiliza la posición del mouse para determinar si se hizo clic en una opción en lugar de hacer clic en el cuadro de selección para abrir el menú desplegable. Utiliza la posición event.screenY ya que esta es la única variable confiable de navegador cruzado. Primero se debe adjuntar un evento de desplazamiento para que pueda determinar la posición de los controles en relación con la pantalla antes del evento de clic.
Aquí está mi jsFiddle http://jsfiddle.net/sU7EV/4/
fuente
deberías intentar usar
option:selected
fuente
Lo que funciona para mi:
De esa manera, onchange llama a 'doSomething ()' cuando la opción cambia, y onclick llama 'doSomething ()' cuando el evento onchange es falso, en otras palabras, cuando selecciona la misma opción
fuente
Pruebe esto (evento activado exactamente cuando selecciona la opción, sin cambiar la opción):
http://jsbin.com/dowoloka/4
fuente
Aquí tiene el índice devuelto, y en el código js puede usar este retorno con un interruptor o lo que desee.
fuente
Prueba esto:
fuente
Hace mucho tiempo, pero en respuesta a la pregunta original, ¿ayudaría esto? Solo ponlo
onClick
en laSELECT
línea. Luego ponga lo que quiere que cada unoOPTION
haga en lasOPTION
líneas. es decir:fuente
fuente
Me enfrenté a una necesidad similar y terminé escribiendo una directiva angularjs para la misma:
enlace guthub - selección angular
Usado
element[0].blur();
para eliminar el foco de la etiqueta de selección. La lógica es activar este desenfoque con el segundo clic del menú desplegable.as-select
se activa incluso cuando el usuario selecciona el mismo valor en el menú desplegable.DEMO - enlace
fuente
La única respuesta verdadera es no usar el campo de selección (si necesita hacer algo cuando vuelve a seleccionar la misma respuesta).
Cree un menú desplegable con div convencional, botón, menú mostrar / ocultar. Enlace: https://www.w3schools.com/howto/howto_js_dropdown.asp
Podría haberse evitado si uno hubiera podido agregar oyentes de eventos a las opciones. Si hubiera habido un oyente onSelect para el elemento select. Y si al hacer clic en el campo de selección no se disparó agravantemente el mousedown, mouseup, y se hizo clic al mismo tiempo en el mousedown.
fuente
Hay algunas cosas que desea hacer aquí para asegurarse de que recuerda los valores más antiguos y desencadena un evento de cambio, incluso si la misma opción se selecciona de nuevo.
Lo primero que quieres es un evento onChange regular:
Para que el evento onChange se active incluso cuando se vuelva a seleccionar la misma opción, puede deshabilitar la opción seleccionada cuando el menú desplegable reciba el foco configurándolo en un valor no válido. Pero también desea almacenar el valor seleccionado previamente para restaurarlo en caso de que el usuario no seleccione ninguna opción nueva:
El código anterior le permitirá activar el cambio incluso si se selecciona el mismo valor. Sin embargo, si el usuario hace clic fuera del cuadro de selección, desea restaurar el valor anterior. Lo hacemos en onBlur:
fuente
Tenga en cuenta que los controladores de eventos no son compatibles con la etiqueta OPTION en IE, con un pensamiento rápido ... Se me ocurrió esta solución, pruébela y envíeme sus comentarios:
Lo que estoy haciendo aquí en realidad es restablecer el índice de selección para que el evento onchange se active siempre, lo cierto es que perdemos el elemento seleccionado al hacer clic y puede ser molesto si su lista es larga, pero puede ayudarlo de alguna manera ..
fuente
¿Qué hay de cambiar el valor de la selección cuando el elemento gana el foco, por ejemplo (con jquery):
fuente
Encontré esta solución.
establecer el índice seleccionado del elemento seleccionado a 0 inicialmente
llame a este método en el evento de cambio
fuente