2012-04-15 72 views
23

我寫了javascript/jQuery的這個片段來改變一個複選框。 http://jsfiddle.net/johnhoffman/crF93/爲什麼動態更改複選框不會觸發表單更改事件?

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

有趣的是,點擊鏈接改變文本框,但不會觸發調用,在Chrome的消息記錄的函數的形式變化事件Web開發者控制檯。爲什麼?我該如何做到這一點?

+0

[當控制失去輸入焦點並因爲其值已被修改「會發生變化事件獲得關注。「](http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents)沒有焦點改變意味着沒有改變事件。 – 2012-04-15 03:21:15

+0

[onchange事件不會在更改來自antoher函數時觸發](http:// stackoverflow。com/questions/7055729/onchange-event-not-fire-when-the-the-change-come-from-antoher-function) – 2012-04-15 03:22:15

回答

24

您需要觸發更改事件,.trigger('change'),使事件都知道,一個變化發生。

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

描述:綁定事件處理程序 「變更」 JavaScript事件,或者觸發元素上的事件。

此方法是前兩個變體中的.on("change", handler)和第三個中的.trigger("change")的快捷方式。

change事件在其值發生更改時發送到元素。此事件限於<input>元素,<textarea>框和<select>元素。對於選擇框,複選框和單選按鈕,當用戶使用鼠標進行選擇時,會立即觸發事件,但對於其他元素類型,事件將被推遲直到元素失去焦點。

演示:

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

使用鏈:http://jsfiddle.net/nPkPw/5/
$("input[type='checkbox']").trigger('change').attr('checked', 'checked');

+1

似乎有點冗長以模擬點擊 – Sinetheta 2012-04-15 03:17:58

+0

@Sinetheta Hiya cooleos會修剪它一下。 :) cheerios! – 2012-04-15 03:19:09

+5

供將來參考,我不得不在attr之後加上觸發器,這樣我的腳本才能看到變化是什麼。 – Yohn 2012-11-10 14:52:00

10

這並不令人感到意外,但我想你可以將它作爲非效果列表in the msdn

  • 「此事件在提交內容時觸發,而不是在 值正在改變。」
  • 「當選擇對象的 選定選項以編程方式更改時,onchange事件不會觸發。」

你總是可以只.click()jsFiddle