Attivare l'evento di modifica dell'elenco a discesa


86

Voglio attivare l'evento di modifica del menu a discesa in $ (documento). Già utilizzando jquery.

Ho un menu a discesa a cascata per paese e stato nella pagina dei dettagli dell'utente. come posso impostare il valore (che viene preso dal DB in base all'ID utente) per il paese e lo stato in MVC con C #.


Potresti voler inserire altri tag come javascript e jQuery per farlo trovare di più
xenon

Risposte:


184

Non conosco molto JQuery ma ho sentito che consente di attivare eventi nativi con questa sintassi.

$(document).ready(function(){

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

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

Devi dichiarare il gestore dell'evento change prima di chiamare trigger () o change () altrimenti non verrà attivato. Grazie per la menzione @LenielMacaferi.

Maggiori informazioni qui .


13
È necessario dichiarare il gestore dell'evento di modifica prima di chiamare trigger()o anche change()come mostrato correttamente in questa risposta, ovvero, se il codice del gestore dell'evento appare sotto la chiamata, non succede nulla! :)
Leniel Maccaferri

3
@LenielMacaferi Grazie per avermi risparmiato un'ora o due.
Frank Nocke

@Christophe Eblé e Leniel Macaferi, grazie mille. Christophe, potresti aggiungere il commento di Leniel alla tua risposta?
Zaxter

Ho usato .change () ma senza fortuna con jquery 3.1.1, dopo questo post si attiva come previsto.
Sorangwala Abbasali

Questo finisce per funzionare all'infinito, la soluzione di tutti a questo finisce per andare in loop.
Nathan McKaskle

12

Prova questo:

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

Definisci l'evento di modifica e attivalo immediatamente. Ciò garantisce che il gestore eventi sia definito prima di chiamarlo.

Potrebbe essere tardi per rispondere al poster originale, ma qualcun altro potrebbe beneficiare della notazione abbreviata, e questo segue il concatenamento di jQuery, ecc.

jquery chaining


7

Prova questo:

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

Per me va bene.

Su una riga insieme all'impostazione del valore: $('#id').val(16).change();


3
$ ('# id'). val (16) .change (); l'ha fatto per me.
TomoMiha

1
Grazie, @TomoMiha. Aggiunto nella risposta.
d.popov

2

Se stai cercando di avere elenchi a discesa collegati, il modo migliore per farlo è avere uno script che restituisca una casella di selezione precostruita e una chiamata AJAX che lo richiede.

Ecco la documentazione per il metodo Ajax di jQuery se ne hai bisogno.

$(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);
            }
        });
    });

});

Quindi fai un intervallo intorno alla casella di selezione dello stato con l'ID di "stateBoxHook"


Ho elenchi a discesa a cascata: <% = Html.DropDownList ("MyCountries", "--- Select Country ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Posso impostare il valore di MyCountries come $ ("# MyCountries"). val ('<% = Model.CountryId%>'); in $ (documento) .ready. Ma non sono in grado di impostare il valore per lo stato in quanto mostra solo un'opzione "Seleziona stato", che dovrebbe essere compilata in caso di cambio di paese in quanto sono elenchi a discesa a cascata. Questo è il vero problema.
Prasad

Non sono ancora sicuro di cosa stai cercando. Stai cercando di ottenere un sistema in base al quale selezionano un paese e restringe l'elenco agli stati di quel paese? In tal caso, sarà necessario effettuare una chiamata AJAX al server e inviare il paese selezionato e quindi restituire un elenco di stati in quel paese.
xenon

Ho impostato USA come Paese e Alabama come Stato che è un menu a discesa a cascata, aggiungendo il profilo utente. E quando torno a quella pagina per modificare un campo, ho bisogno che Paese e Stato siano popolati con i valori che ho impostato in precedenza. Non ho problemi ad aggiungere il profilo utente, quando torno alla pagina per modificare, sono in grado di impostare il valore per il menu a discesa Paese e nel menu a discesa dello stato i valori non sono riempiti poiché è a cascata che viene riempito sul valore del paese cambia evento. Per questo devo attivare l'evento di cambiamento del paese in modo che lo stato venga riempito e posso impostare lo stato
Prasad

Perché è così? Sai qual è il paese al momento del caricamento della pagina, quindi potresti visualizzare l'elenco di selezione corretto degli stati con lo stato corretto selezionato. Quando cambi il paese, l'elenco verrà comunque ricaricato.
xenon

1

in alternativa puoi mettere l'attributo onchange nell'elenco a discesa stesso, che onchange chiamerà determinate funzioni jquery come questa.

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

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

spero che questo ti aiuti, e tieni presente che questo codice è solo una bozza approssimativa, non testato su alcun ide. Grazie


Questo non attiva l'evento di modifica quando la pagina viene caricata per la prima volta (come da domanda dell'OP)

0

Per qualche motivo, le altre jQuerysoluzioni fornite qui hanno funzionato durante l'esecuzione dello script dalla console, tuttavia, non ha funzionato per me quando attivato da Chrome Bookmarklet .

Fortunatamente, questa soluzione Vanilla JS (la triggerChangeEventfunzione) ha funzionato:

/**
  * 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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.