Activar evento de cambio de menú desplegable

86

Quiero activar el evento de cambio del menú desplegable en $ (documento). Listo usando jquery.

Tengo un menú desplegable en cascada para el país y el estado en la página de detalles del usuario. ¿Cómo puedo establecer el valor (que se toma de DB según la identificación del usuario) para el país y el estado en MVC con C #?

Prasad
fuente
Es posible que desee poner más etiquetas como javascript y jQuery para que esto se encuentre más
xenon

Respuestas:

185

No sé mucho de JQuery, pero he oído que permite disparar eventos nativos con esta sintaxis.

$(document).ready(function(){

    $('#countrylist').change(function(e){
       // Your event handler
    });

    // And now fire change event when the DOM is ready
    $('#countrylist').trigger('change');
});

Debe declarar el controlador de eventos de cambio antes de llamar a trigger () o change (), de lo contrario no se activará. Gracias por la mención @LenielMacaferi.

Más información aquí .

Christophe Eblé
fuente
13
Debe declarar el controlador de eventos de cambio antes de llamar trigger()o incluso change()como se muestra correctamente en esta respuesta, es decir, si el código del controlador de eventos aparece debajo de la llamada, ¡no pasa nada! :)
Leniel Maccaferri
3
@LenielMacaferi Gracias por ahorrarme una o dos horas.
Frank Nocke
@Christophe Eblé & Leniel Macaferi, Muchas gracias. Christophe, ¿podría agregar el comentario de Leniel a su respuesta?
Zaxter
Usé .change () pero no tuve suerte con jquery 3.1.1, después de esta publicación se está activando como se esperaba.
Sorangwala Abbasali
Esto simplemente termina en bucle sin fin, la solución de todos para esto termina en bucle.
Nathan McKaskle
12

Prueba esto:

$(document).ready(function(event) {
    $('#countrylist').change(function(e){
         // put code here
     }).change();
});

Defina el evento de cambio y actívelo inmediatamente. Esto asegura que el controlador de eventos esté definido antes de llamarlo.

Puede que sea tarde para responder el póster original, pero alguien más podría beneficiarse de la notación abreviada, y esto sigue al encadenamiento de jQuery, etc.

encadenamiento de jquery

mlnyc
fuente
7

Prueba esto:

$('#id').change();

Funciona para mi.

En una línea junto con la configuración del valor: $('#id').val(16).change();

d.popov
fuente
3
$ ('# id'). val (16) .change (); lo hizo por mí.
TomoMiha
1
Gracias, @TomoMiha. Lo agregó en la respuesta.
d.popov
2

Si está tratando de tener listas desplegables vinculadas, la mejor manera de hacerlo es tener un script que devuelva un cuadro de selección prediseñado y una llamada AJAX que lo solicite.

Aquí está la documentación para el método Ajax de jQuery si lo necesita.

$(document).ready(function(){

    $('#countrylist').change(function(e){
        $this = $(e.target);
        $.ajax({
            type: "POST",
            url: "scriptname.asp", // Don't know asp/asp.net at all so you will have to do this bit
            data: { country: $this.val() },
            success:function(data){
                $('#stateBoxHook').html(data);
            }
        });
    });

});

Luego, tenga un intervalo alrededor del cuadro de selección de su estado con la identificación de "stateBoxHook"

xenón
fuente
Tengo menús desplegables en cascada: <% = Html.DropDownList ("MyCountries", "--- Select Country ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Puedo configurar el valor de MyCountries como $ ("# MyCountries"). val ('<% = Model.CountryId%>'); en $ (documento). listo. Pero no puedo establecer el valor para el estado, ya que solo muestra una opción "Seleccionar estado", que debe completarse en el evento de cambio de país, ya que son menús desplegables en cascada. Este es un problema real.
Prasad
Todavía no estoy seguro de lo que busca. ¿Está tratando de lograr un sistema mediante el cual seleccionan un país y reduce la lista a los estados de ese país? Si este es el caso, deberá tener una llamada AJAX al servidor y enviar el país seleccionado y luego devolver una lista de estados en ese país.
xenon
He configurado EE.UU. como país y Alabama como estado, que es un menú desplegable en cascada, mientras agrego el perfil de usuario. Y cuando vuelvo a esa página para editar un campo, necesito que el país y el estado se completen con los valores que he establecido previamente. No tengo ningún problema para agregar el perfil de usuario, cuando vuelvo a la página para Editar, puedo establecer el valor para el menú desplegable de País y en el menú desplegable de estado los valores no se completan, ya que está en cascada, lo que se completa con el valor del país cambio de evento. Para esto, necesito activar el evento de cambio de país para que el estado se llene y pueda establecer el estado
Prasad
¿Por qué es este el caso? Usted sabe cuál es el país en el momento de la carga de la página, por lo que puede representar la lista de selección correcta de estados con el estado correcto seleccionado. Cuando cambie el país, la lista se volverá a cargar de todos modos.
xenon
1

alternativamente, puede poner el atributo onchange en la propia lista desplegable, que onchange llamará a cierta función jquery como esta.

<input type="dropdownlist" onchange="jqueryFunc()">

<script type="text/javascript">
$(function(){
    jqueryFunc(){
        //something goes here
    }
});
</script>

Espero que este te ayude, y ten en cuenta que este código es solo un borrador, no probado en ningún ide. Gracias

Dave
fuente
Esto no activa el evento de cambio cuando la página se carga por primera vez (según la pregunta de OP)
0

Por alguna razón, las otras jQuerysoluciones proporcionadas aquí funcionaron al ejecutar el script desde la consola, sin embargo, no funcionó para mí cuando se activó desde Chrome Bookmarklets .

Afortunadamente, esta solución de Vanilla JS (la triggerChangeEventfunción) funcionó:

/**
  * Trigger a `change` event on given drop down option element.
  * WARNING: only works if not already selected.
  * @see /programming/902212/trigger-change-event-of-dropdown/58579258#58579258
  */
function triggerChangeEvent(option) {
  // set selected property
  option.selected = true;
  
  // raise event on parent <select> element
  if ("createEvent" in document) {
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("change", false, true);
    option.parentNode.dispatchEvent(evt);
  }
  else {
    option.parentNode.fireEvent("onchange");
  }
}

// ################################################
// Setup our test case
// ################################################

(function setup() {
  const sel = document.querySelector('#fruit');
  sel.onchange = () => {
    document.querySelector('#result').textContent = sel.value;
  };
})();

function runTest() {
  const sel = document.querySelector('#selector').value;
  const optionEl = document.querySelector(sel);
  triggerChangeEvent(optionEl);
}
<select id="fruit">
  <option value="">(select a fruit)</option>
  <option value="apple">Apple</option>
  <option value="banana">Banana</option>
  <option value="pineapple">Pineapple</option>
</select>

<p>
  You have selected: <b id="result"></b>
</p>
<p>
  <input id="selector" placeholder="selector" value="option[value='banana']">
  <button onclick="runTest()">Trigger select!</button>
</p>

Domi
fuente