2012-04-15 27 views
23

Tôi đã viết đoạn mã javascript/jQuery này để thay đổi một hộp kiểm. http://jsfiddle.net/johnhoffman/crF93/Tại sao tự động thay đổi hộp kiểm không kích hoạt sự kiện thay đổi biểu mẫu?

Javascript

$(function() { 
    $("a").click(function() { 
     if ($("input[type='checkbox']").attr('checked') == "checked") 
      $("input[type='checkbox']").removeAttr('checked'); 
     else 
      $("input[type='checkbox']").attr('checked', 'checked'); 
     return false; 
    }); 

    $("input[type='checkbox']").change(function(){ 
     console.log("Checkbox changed.");    
    });  
});​ 

HTML

<input type="checkbox" /> 
<a href="#">Change CheckBox</a>​ 

Điều thú vị là, nhấn vào liên kết làm thay đổi hộp văn bản, nhưng không kích hoạt sự kiện thay đổi hình thức mà các cuộc gọi chức năng mà các bản ghi một thông điệp trong Chrome Bảng điều khiển dành cho nhà phát triển web. Tại sao? Làm thế nào để tôi làm điều đó?

+0

[ "Các sự kiện thay đổi xảy ra khi một điều khiển mất tập trung đầu vào và giá trị của nó đã được sửa đổi từ tập trung. "] (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents) Không có thay đổi tập trung có nghĩa là không có sự kiện thay đổi. –

+0

có thể trùng lặp của [sự kiện trao đổi không kích hoạt khi thay đổi đến từ chức năng chống trộm] (http: // stackoverflow.com/questions/7055729/onchange-event-not-fire-khi-the-change-come-from-antoher-function) –

Trả lời

24

Bạn cần phải kích hoạt sự kiện thay đổi, .trigger('change'), vì vậy sự kiện đó đều biết rằng một sự thay đổi đã diễn ra.

Từ http://api.jquery.com/change/:

Mô tả: Bind một event handler để "thay đổi" sự kiện JavaScript, hoặc kích hoạt sự kiện trên một phần tử.

Phương pháp này là lối tắt cho .on("change", handler) trong hai biến thể đầu tiên và .trigger("change") ở thứ ba.

Sự kiện change được gửi đến một phần tử khi giá trị của nó thay đổi. Sự kiện này được giới hạn ở các thành phần <input>, <textarea><select> yếu tố. Đối với các hộp chọn, hộp kiểm và nút radio, sự kiện được kích hoạt ngay lập tức khi người dùng thực hiện lựa chọn bằng chuột, nhưng đối với các yếu tố khác, sự kiện được hoãn lại cho đến khi yếu tố mất tiêu điểm.

Demo:

http://jsfiddle.net/nPkPw/3/

Sử dụng chaining: http://jsfiddle.net/nPkPw/5/
tức $("input[type='checkbox']").trigger('change').attr('checked', 'checked');

+1

có vẻ hơi dài để mô phỏng một cú nhấp chuột – Sinetheta

+0

@Sinetheta Hiya cooleos sẽ cắt nó một chút. :) cổ vũ! –

+5

để tham khảo trong tương lai, tôi đã phải kích hoạt sau khi attr để kịch bản của tôi để xem những gì thay đổi được. – Yohn

10

Điều này không đáng ngạc nhiên, nhưng tôi đoán bạn có thể làm như vậy trong danh sách không có hiệu lực in the msdn.

  • "Sự kiện này được kích hoạt khi nội dung được cam kết và không trong khi giá trị đang thay đổi".
  • "Sự kiện trao đổi không kích hoạt khi tùy chọn đã chọn của đối tượng được chọn được thay đổi theo chương trình."

Bạn có thể luôn luôn chỉ .click()jsFiddle

Các vấn đề liên quan