2012-06-26 33 views
10

Được rồi, tôi không hiểu tại sao điều này không hoạt động. Nó có vẻ khá đơn giản.HTML <select> JQuery .thay đổi không hoạt động

Đây là trình đơn thả xuống của tôi:

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

và đây là hoạt Javascript

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

Ngay bây giờ tôi chỉ muốn làm cho nó làm việc vì vậy tôi có thể thêm chức năng. Cảm ơn!

+0

gì được đầu ra trả lại của điều khiển (xem nguồn, kiểm tra nguyên tố, vv ...)? –

+0

tha thứ cho tôi, tôi không biết yêu cầu của bạn là gì. Tôi là một sinh viên CS. và tôi thực tế không có kiến ​​thức về javascript – theCamburglar

+0

Bạn có nó chạy trong $ (tài liệu) .ready (function() {NÀY CODE HERE}); hoặc chỉ là $ (hàm() {CODE HERE}); ? Có vẻ đúng với tôi ... – ntgCleaner

Trả lời

27

Mã đó chính xác về cú pháp. Nhiều khả năng chạy nó vào thời điểm sai.

Bạn sẽ muốn để ràng buộc sự kiện này khi DOM đã sẵn sàng:

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

Hoặc, sử dụng live:

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

Hoặc, sử dụng delegate:

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

Hoặc, nếu bạn đang sử dụng jQuery 1.7+:

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

Tuy nhiên, nó thường là tốt nhất để thực hiện kịch bản một lần trình duyệt đã xong render Markup.

+0

Không quan trọng vì '.change' sẽ áp dụng cho mọi phần tử mới được thêm vào. (Sửa tôi nếu nó không chính xác) –

+3

@Derek: Bạn sai, nó áp dụng cho các phần tử khớp với biểu thức (#yearDropdown) vào thời điểm dòng đó được thực thi. jQuery không giám sát các thành phần mới hoặc bất cứ thứ gì giống nhau. – WhyNotHugo

+1

@ user1469925 Sự khác biệt là hàm này được gọi khi tài liệu đã tải xong và DOM đã được tạo. Mã của bạn thực hiện ngay khi nó được đọc và DOM có thể chưa sẵn sàng - lựa chọn chưa tồn tại. – WhyNotHugo

0

Mã của bạn là đúng và đang làm việc cho tôi, xem tại đây: http://jsfiddle.net/mobweb/2Skp9/

Bạn có chắc chắn jQuery đã được nạp đúng cách?

0

Không chắc chắn nếu điều này sẽ giúp đỡ, nhưng bạn có thể thử điều này:

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

'Kể từ jQuery 1.7, phương thức .live() không được chấp nhận. Sử dụng .on() để đính kèm trình xử lý sự kiện. ' –

+0

Đó là? Cần phải đọc lên trên ghi chú phát hành sau đó tôi đoán. Cảm ơn bạn về thông tin. – Logard

+0

http://liveisdeprecated.com –

1

Tôi đã thử code của bạn in jsFiffle. Tôi đã thêm vài năm làm tùy chọn theo cách thủ công. Nó hoạt động đúng.

Chỉ cần ràng buộc sự kiện .change trong $ (document) .ready:

$(document).ready(function(){ 
    $("#yearDropdown").change(function() { 
     alert('The option with value ' + $(this).val()); 
    });​ 
}); 
Các vấn đề liên quan