es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué solo un evento de cambio único está funcionando en el elemento de selección en jQuery?

Necesito cambiar el comportamiento de la biblioteca de jQuery (selector de rango de fechas), tiene un código como este:

box.find('.month').off("change").change(function(evt) {
    dateChanged($(this));
});
box.find('.year').off("change").change(function(evt) {
    dateChanged($(this));
});

Esos son dos elementos select. No devuelve false y las funciones dentro del controlador no acceden al evento. Pero por alguna razón mis eventos que utilizan la delegación no funcionan. Son ignorados.

$picker.on('change', 'select', function() {
   console.log('CHANGE');
});

La consola no se ejecuta, pero si quito las líneas anteriores de la biblioteca, mi código de delegación de eventos funciona bien.

NOTA: $picker es un objeto en mi código que es el padre del elemento box. Pero también tengo un evento agregado en $(document) que tampoco funciona.

Es la primera vez que veo algo así. Agregar un evento directamente al elemento evita la propagación del evento. ¿Alguien puede explicar qué está sucediendo aquí? ¿Está esto documentado en algún lugar?

Esto ocurre en Firefox y Chrome.

Si alguien necesita un ejemplo sencillo, puedo crear uno. Pero pensé que esto es autoexplicativo.

EDIT: He creado una simple reproducción y funciona bien. Tengo una aplicación compleja con muchos archivos (Aplicación R Shiny), pero no veo ningún evento de cambio en las herramientas de desarrollo. ¿Existe alguna manera de evitar que el evento se propague? ¿Quizás usando la captura de eventos? ¿Qué debo buscar para encontrar el código que evita que los eventos se propaguen?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la biblioteca original de jQuery está utilizando el método off para eliminar cualquier controlador de eventos change previamente adjuntado a los elementos box.find('.month') y box.find('.year'), y luego adjunta su propio controlador de eventos change llamado dateChanged. Esto significa que cualquier otro controlador de eventos change adjuntado utilizando la delegación de eventos en los elementos box, $picker o $(document) no se ejecutará porque la propagación del evento se previene por el código de la biblioteca jQuery.

    Una posible solución sería modificar el código de la biblioteca jQuery para activar el evento change en los elementos box, $picker o $(document), lo que ejecutaría cualquier código de delegación de eventos agregado a ellos. Otra solución podría ser utilizar la captura de eventos para interceptar el evento change antes de que llegue a los elementos box.find('.month') y box.find('.year'), pero esto requeriría una codificación cuidadosa para evitar interferir con otras partes de la aplicación.

    Es importante tener en cuenta que este problema podría ser específico de la implementación de la aplicación y no está claro si está documentado en algún lugar. Sería útil consultar la documentación de jQuery o buscar la opinión de otros expertos en el campo.

Comments are closed.