2012-06-26 24 views
10

Tamam Neden bunun işe yaramadığını anlamıyorum. Oldukça basit görünüyor.HTML <select> JQuery değiştirilemiyor

İşte benim açılan menü:

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

ve burada JavaScript

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

Şu anda sadece bu yüzden işlevler ekleyebilirsiniz çalışma almak istemeniz. Teşekkürler!

+0

kontrolün render çıkış (kaynağı görüntüle, öğeyi denetle, vb ...) Ne:

Sadece .ready $ (belgesindeki) .change olayı bağlamak? –

+0

beni affediyor, ne istediğini bilmiyorum. Ben bir CS öğrenciyim. ve hemen hemen hiçbir javascript bilgim yok – theCamburglar

+0

Bir $ (document) .ready (function() {THIS CODE HERE} içinde çalışıyor mu?); ya da sadece bir $ (function() {CODE HERE}); ? Bana doğru görünüyor ... – ntgCleaner

cevap

27

Bu kod sözdizimsel olarak doğrudur. Büyük ihtimalle yanlış zamanda çalışıyor.

DOM hazır olduğunda olay bağlamak isteyeceksiniz

:

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

Veya live kullanın:

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

Veya kullanmak delegate:

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

Veya jQuerykullanıyorsanız 210:

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

Bununla birlikte, tarayıcı İşaretleme render bittikten sonra senaryoyu yürütmek için genellikle en iyisidir.

+0

Bu fark etmez çünkü .change her yeni eklenen öğeye uygulanacaktır. (Yanlış ise düzeltin) –

+3

@Derek: Yanlışsınız, satırın çalıştırıldığı andaki ifadeyle eşleşen öğelere (#yearDropdown) uygulanır. jQuery yeni öğeleri veya benzerlerini izlemez. – WhyNotHugo

+1

@ user1469925 Fark, bu işlevin, belgenin yüklenmesi bittiğinde ve DOM oluşturulduğunda çağrılmasıdır. Kodunuz okunduğunda çalışır ve DOM henüz hazır olmayabilir - seçim henüz mevcut değil. – WhyNotHugo

0

Emin değilim, ama bu deneyebilirsiniz:

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

'jQuery 1.7'den itibaren .live() yöntemi kullanımdan kaldırılmıştır. Olay işleyicilerini eklemek için .on() öğesini kullanın. –

+0

öyle mi? Tahliye notlarını okumam gerekiyor sanırım. Bilgi için teşekkürler. – Logard

+0

http://liveisdeprecated.com –

1

Ben kodunuzu in jsFiffle çalıştılar. Bazı seçenekleri el ile birkaç yıl ekledim. Doğru çalışıyor.

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