2012-06-26 18 views
10

W porządku Nie rozumiem, dlaczego to nie działa. Wydaje się całkiem proste.HTML <select> JQuery .change nie działa

Oto moja rozwijane menu:

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

i oto JavaScript

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

Teraz po prostu chcę, aby to działa, więc mogę dodać funkcjonalność. Dzięki!

+0

Co jest renderowane wyjście sterowania (tekst źródłowy, wglądu do elementu, etc ...)? –

+0

wybacz mi, nie wiem, o co pytasz. Jestem studentem CS. i nie mam praktycznie żadnej wiedzy o javascript – theCamburglar

+0

Czy masz to uruchomione w $ (document) .ready (function() {TEN KOD TUTAJ}); lub tylko $ (function() {KOD TUTAJ}); ? Wygląda mi to na miarę ... – ntgCleaner

Odpowiedz

27

Ten kod jest poprawny pod względem składniowym. Najprawdopodobniej działa to w niewłaściwym czasie.

będziemy chcieli powiązać zdarzenie gdy DOM jest gotowy:

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

Lub użyj live:

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

Lub użyj delegate:

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

Lub, jeśli używasz jQuery 1.7+:

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

Niemniej jednak, jest to zwykle najlepiej wykonać skryptu po zakończeniu renderowania przeglądarka znaczników.

+0

Nie ma znaczenia, ponieważ '.change' będzie dotyczyć każdego nowo dodanego elementu. (Popraw mnie, jeśli jest niepoprawny) –

+3

@Derek: Mylisz się, dotyczy elementów pasujących do wyrażenia (#yearDropdown) w momencie wykonania linii. jQuery nie monitoruje nowych elementów ani niczego podobnego. – WhyNotHugo

+1

@ user1469925 Różnica polega na tym, że ta funkcja jest wywoływana po zakończeniu ładowania dokumentu i utworzeniu DOM. Twój kod jest wykonywany natychmiast po jego przeczytaniu, a DOM może nie być jeszcze gotowy - wybór jeszcze nie istnieje. – WhyNotHugo

0

Nie wiem, czy to pomoże, ale można spróbować to:

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

'Jak z jQuery 1.7, metoda .live() jest przestarzała. Użyj .on(), aby dołączyć programy obsługi zdarzeń. ' –

+0

To jest? Muszę przeczytać informacje o wydaniu. Dzięki za informację. – Logard

+0

http://liveisdeprecated.com –

1

Próbowałem swój kod in jsFiffle. Ręcznie dodałem kilka lat jako opcje. To działa poprawnie.

Wystarczy powiązać zdarzenie .change w $ (document) .ready:

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