Foros del Web » Programando para Internet » Jquery »

[SOLUCIONADO] Detectar evento "onchange" en lista desplegable

Estas en el tema de Detectar evento "onchange" en lista desplegable en el foro de Jquery en Foros del Web. Hola a todos, Entiendo que esto que necesito hacer es posible, pero me estoy volviendo loco para encontrar la forma de conseguirlo. Estoy utilizando el ...
  #1 (permalink)  
Antiguo 23/11/2016, 11:46
Avatar de majete  
Fecha de Ingreso: noviembre-2007
Mensajes: 96
Antigüedad: 17 años
Puntos: 2
Exclamación Detectar evento "onchange" en lista desplegable

Hola a todos,
Entiendo que esto que necesito hacer es posible, pero me estoy volviendo loco para encontrar la forma de conseguirlo.

Estoy utilizando el plugin "formeter" (http://www.formeter.techlabs.ro/advanced.html) para tener una barra de progreso para un formulario. Cuando detecta un cambio en las listas desplegables o radiobuttons con el evento "ON CHANGE" hace su función y marca el avance en la barra. También si detecta el evento "ON KEYDOWN" para los campos de texto inputs.

El problema es que yo estoy sacando el valor de otra forma, no actuando directamente sobre ese elemento y lo que me pasa es que no funciona de esta manera.

Tengo este jquery
Código Javascript:
Ver original
  1. $(mainForm).find(sel + ':checkbox, ' + sel + ':radio, select' + sel).on('change', function () {
  2.                 animateBar.call(_this);
  3.             });
  4. $(mainForm).find('input[type=text]' + sel + ', input[type=password]' + sel + ', textarea' + sel + ', input[type=hidden]' + sel + ',  input[type=email]' + sel + ', input[type=tel]' + sel).on('keydown', function () {
  5.                 timer && clearTimeout(timer);
  6.                 timer = setTimeout(function () {
  7.                     animateBar.call(_this);
  8.                 }, 300);
  9.             });

Si yo en un campo del formulario escribo algo sobre el input todo funciona (coge el "KEY DOWN" pero si yo le asigno el valor de ese input de otra forma (se lo paso por jquery) al no detectar el evento el KEY DOWN no actúa.

¿Se os ocurre cómo puedo solucionarlo?

He probado cambiando el evento de "keydown" a "change" pero nada, no lo detecta, a pesar de que cambio el valor del input o de la lista desplegable. Me vale cualquiera de las dos porque puedo asignar un valor tanto a un campo INPUT como a un campo SELECT.

Mil gracias!!
  #2 (permalink)  
Antiguo 24/11/2016, 00:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Detectar evento "onchange" en lista desplegable

Cita:
Iniciado por majete Ver Mensaje
[...] pero si yo le asigno el valor de ese input de otra forma (se lo paso por jquery) [...]
¿Y si en ese bloque de código ejecutas las acciones que deben ocurrir cuando ocurra un cambio?

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 24/11/2016, 03:29
Avatar de majete  
Fecha de Ingreso: noviembre-2007
Mensajes: 96
Antigüedad: 17 años
Puntos: 2
Exclamación Respuesta: Detectar evento "onchange" en lista desplegable

Cita:
Iniciado por Alexis88 Ver Mensaje
¿Y si en ese bloque de código ejecutas las acciones que deben ocurrir cuando ocurra un cambio?

Sí, eso había pensado... pero el tema es que no llega a ejecutarse el evento... me explico:

1. Utilizo un rangeslider de bootstrap para asignar el valor al campo input correspondiente (o select, porque he probado varios tipos)
2. El campo input (o select) muestra el valor que yo le he asignado pero no se activa el evento "onchange" en el caso del select, y comprensiblemente, no se activa el evento "onkeydown" porque no se ha tecleado nada, sino que sólo se ha cambiado el valor.

El tema es que si yo directamente en el campo input introduzco el dato se activa el "keydown", o si cambio el valor del SELECT también se activa el "onchange", pero no consigo activar ningún evento sin tocar directamente en los campos, y sólo cambiando el valor del dato que contienen.

Si os fijáis en el código que he puesto, los campos input funcionan con la acción "onkeydown"y los radiobutton, cheklist, etc. funcionan con la acción "onchange".

Claro, yo necesito de alguna forma forzar ese evento con alguna acción, pero no lo consigo.

¿Alguna idea?
Mil gracias!!

Última edición por majete; 24/11/2016 a las 03:43
  #4 (permalink)  
Antiguo 24/11/2016, 12:23
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Detectar evento "onchange" en lista desplegable

El punto es que, si realizas el cambio desde el código, se omite la interacción con el DOM, por lo que evidentemente esos eventos no se ejecutarán. Por eso es que te sugiero que, en el bloque de código en el que realizas la asignación de del dato, ejecutes las acciones que deseas. Si no quieres repetir líneas de código, puedes tener todo en una función a la cual solo tendrías que llamar.

Un ejemplo:
Código HTML:
Ver original
  1. <select id="foo">...</select>
  2. <input type="text" id="bar" />
Código Javascript:
Ver original
  1. //La función a ejecutarse
  2. function ejemplo(){
  3.     alert("Ocurrió un cambio");
  4. }
  5.  
  6. //Si se producen estos eventos en los elementos del DOM, se ejecutará la función "ejemplo"
  7. $("#foo").on("change", ejemplo);
  8. $("#bar").on("keydown change", ejemplo);
  9.  
  10. //Si hago el cambio de valor desde el código, también se ejecutará la función "ejemplo"
  11. $("#foo").val("abc");
  12. ejemplo();
  13.  
  14. $("#bar").val("def");
  15. ejemplo();

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 30/11/2016, 02:53
Avatar de maligix  
Fecha de Ingreso: julio-2011
Ubicación: Barcelona
Mensajes: 29
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Detectar evento "onchange" en lista desplegable

Hola,

Creo entender que pretendes lo siguiente:

Cuando tenemos una lista desplegable select con diferentes option, en general nos interesará saber cuál de los elementos option es el que se encuentra seleccionado y el contenido de su atributo value. Para ello hemos de tener en cuenta que:

a) Cada elemento HTML de tipo select tiene una propiedad denominada options, de tipo array, que contiene los elementos options con índice 0, 1, 2, … n. Por ejemplo aquí vemos cómo extraer los elementos select, sus atributos value y el texto que contienen (mediante la propiedad text).

var elementosSelect = document.getElementsByTagName('select');
alert('Contenido de value es: '+ elementosSelect[0].value;
alert('Contenido texto es: '+ elementosSelect[0].text;




La propiedad selectedIndex del elemento select nos devuelve el índice numérico de la opción seleccionada (la primera opción tiene índice 0, la segunda 1, y así sucesivamente).

Aquí vemos un ejemplo de cómo se puede utilizar selectedIndex:

var elementoCiudad = document.getElementById('ciudad');
var indiceSeleccionado = elementoCiudad.selectedIndex;
alert (elementoCiudad.options[indiceSeleccionado].text);




También podemos escribir elementoCiudad.options[elementoCiudad.selectedIndex].text prescindiendo del uso de la variable intermedia indiceSeleccionado.

El evento para detectar cambios en los select normalmente será “onchange”.

Yo lo tengo implementado en relación con la selección letra por letra del código de captcha en:
[URL="http://tecnicoinformaticobarcelona.com/"]tecnico informatico[/URL]

Saludos,

Manuel

Última edición por maligix; 30/11/2016 a las 02:54 Razón: cambio
  #6 (permalink)  
Antiguo 13/12/2016, 04:52
Avatar de majete  
Fecha de Ingreso: noviembre-2007
Mensajes: 96
Antigüedad: 17 años
Puntos: 2
Respuesta: Detectar evento "onchange" en lista desplegable

Cita:
Iniciado por Alexis88 Ver Mensaje
El punto es que, si realizas el cambio desde el código, se omite la interacción con el DOM, por lo que evidentemente esos eventos no se ejecutarán. Por eso es que te sugiero que, en el bloque de código en el que realizas la asignación de del dato, ejecutes las acciones que deseas. Si no quieres repetir líneas de código, puedes tener todo en una función a la cual solo tendrías que llamar.

Un ejemplo:
Código HTML:
Ver original
  1. <select id="foo">...</select>
  2. <input type="text" id="bar" />
Código Javascript:
Ver original
  1. //La función a ejecutarse
  2. function ejemplo(){
  3.     alert("Ocurrió un cambio");
  4. }
  5.  
  6. //Si se producen estos eventos en los elementos del DOM, se ejecutará la función "ejemplo"
  7. $("#foo").on("change", ejemplo);
  8. $("#bar").on("keydown change", ejemplo);
  9.  
  10. //Si hago el cambio de valor desde el código, también se ejecutará la función "ejemplo"
  11. $("#foo").val("abc");
  12. ejemplo();
  13.  
  14. $("#bar").val("def");
  15. ejemplo();

Exactamente es lo que me comentas... al realizar el cambio desde código, no llega la interacción al DOM y el evento no se ejecuta. Me es imposible saber qué es lo que le tengo que meter a la función, porque el JS que hay ahora (formeter.js) me resulta muy complicado de entender. Empieza así:
Código Javascript:
Ver original
  1. (function ($) {
  2.     $.fn.extend({
  3.         formProgress: function (options) {
  4.             var st = {
  5.                 speed: 300,
  6.                 style: 'green',
  7.                 bubble: false,
  8.                 selector: '.required',
  9.                 minPercent: 30,
  10.                 message: 'Please complete all required fields !'
  11.             };
  12.             if (options) {
  13.                 $.extend(st, options);
  14.             }
  15.             var _this = $(this),
  16.                 sel = st.selector,
  17.                 mainForm = $(sel).parents('form'),
  18.                 names = [],
  19.                 timer;
  20.  
  21.             $(sel + ":radio").each(function () {
  22.                 var n = $(this).attr('name');
  23.                 if ($.inArray(n, names) < 0) {
  24.                     names.push(n);
  25.                 }
  26.             });
  27.  
  28.             var totalInputs = $(sel).not(":radio").length + names.length;
  29.  
  30.             $(mainForm).find(sel + ':checkbox, ' + sel + ':radio, select' + sel).on('change', function () {
  31.                 animateBar.call(_this);
  32.             });
  33.             $(mainForm).find('input[type=text]' + sel + ', input[type=password]' + sel + ', textarea' + sel + ', input[type=hidden]' + sel + ',  input[type=email]' + sel + ', input[type=tel]' + sel).on('keydown', function () {
  34.                 timer && clearTimeout(timer);
  35.                 timer = setTimeout(function () {
  36.                     animateBar.call(_this);
  37.                 }, 300);
  38.             });
  39. ...

Los cambios en los campos de formulario se ejecutan en los "onchange" u "onkeydown"...

Última edición por majete; 13/12/2016 a las 04:58 Razón: Faltaba información
  #7 (permalink)  
Antiguo 15/12/2016, 04:00
Avatar de majete  
Fecha de Ingreso: noviembre-2007
Mensajes: 96
Antigüedad: 17 años
Puntos: 2
Respuesta: Detectar evento "onchange" en lista desplegable

Bueno, parece que ya solucioné todo!
Muchas gracias a todos y en especial a @maligix por la ayuda.

La función que tengo que ejecutar se llama "updateProgressBar()" y tal y como me dijo lo llamo una vez actualizo el valor del campo.

Mil gracias!!
JC

Etiquetas: onchange
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:12.