2012-06-26 4 views
10

OK, non vedo perché questo non funziona. Sembra abbastanza semplice.HTML <select> JQuery .change non funziona

Ecco il mio menu a discesa:

<div> 
    <form> 
     <select id='yearDropdown'> 
      <c:forEach var="years" items="${parkYears}"> 
       <option value=/events.html?display_year=${years}<c:if test="${currentYear == years}">selected="selected"</c:if>>${years}</option> 
      </c:forEach> 
     </select> 
    </form> 
</div> 

e qui è il JavaScript

$("#yearDropdown").change(function() { 
    alert('The option with value ' + $(this).val()); 
}); 

In questo momento ho solo voglia di farlo funzionare in modo da poter aggiungere funzionalità. Grazie!

+0

Qual è la produzione di rendering del controllo (vista origine, ispezionare elemento, ecc ...)? –

+0

perdonami, non so cosa stai chiedendo. Sono uno studente di CS. e non ho praticamente conoscenza di javascript – theCamburglar

+0

Ce l'hai in esecuzione in un $ (documento) .ready (function() {THIS CODE HERE}); o solo un $ (function() {CODE HERE}); ? Sembra corretto per me ... – ntgCleaner

risposta

27

Questo codice è sintatticamente corretto. Molto probabilmente lo sta eseguendo nel momento sbagliato.

Avrai voglia di legare l'evento quando il DOM è pronto :

$(function(){ /* DOM ready */ 
    $("#yearDropdown").change(function() { 
     alert('The option with value ' + $(this).val()); 
    }); 
}); 

In alternativa, utilizzare live:

$("#yearDropdown").live('change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

In alternativa, utilizzare delegate:

$(document.body).delegate('#yearDropdown', 'change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

Oppure, se stai usando jQuery 1.7+:

$("#yearDropdown").on('change', function() { 
    alert('The option with value ' + $(this).val()); 
}); 

Tuttavia, di solito è meglio per eseguire lo script una volta che il browser ha finito di rendering Markup.

+0

Non importa perché '.change' si applica a ogni elemento appena aggiunto. (Correggimi se è errato) –

+3

@Derek: ti sbagli, si applica agli elementi che corrispondono all'espressione (#yearDropdown) nel momento in cui viene eseguita la riga. jQuery non monitora i nuovi elementi o qualcosa di simile. – WhyNotHugo

+1

@ user1469925 La differenza è che questa funzione viene chiamata una volta che il documento ha terminato il caricamento e il DOM è stato creato. Il tuo codice viene eseguito non appena viene letto e il DOM potrebbe non essere ancora pronto - la selezione non esiste ancora. – WhyNotHugo

0

Non sono sicuro se questo aiuterà, ma si potrebbe provare questo:

$("#yearDropdown").live("change", function() { 
    alert('The option with value ' + $(this).val()); 
}); 
+4

'A partire da jQuery 1.7, il metodo .live() è deprecato. Usa .on() per allegare gestori di eventi. ' –

+0

Lo è? Devo leggere le note di rilascio, quindi credo. Grazie per le informazioni. – Logard

+0

http://liveisdeprecated.com –

1

Ho provato il codice in jsFiffle. Ho aggiunto manualmente alcuni anni come opzioni. Funziona bene.

Basta legare l'evento .Per passare nel $ (document) .ready:

$(document).ready(function(){ 
    $("#yearDropdown").change(function() { 
     alert('The option with value ' + $(this).val()); 
    });​ 
});