2012-04-15 5 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 Developer Console。どうして?それをどうすればいいのですか?

+0

[コントロールが入力フォーカスを失って、その値が後に変更されたときに「変更イベントが発生(http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents)フォーカスの変更は変更イベントを意味しません。 –

+0

可能性のある重複[onchangeイベントは、antoher関数からの変更が発生したときに発生しません](http:// stackoverflow。com/questions/7055729/onchange-event-not-fire-on-the-antoher-functionからの変更) –

答えて

24

あなたは、変更イベント、.trigger('change')をトリガするために必要とすることができるので、そのイベントは、変更が行われたことを知っています。 http://api.jquery.com/change/から

説明: "変更" JavaScriptイベントにイベントハンドラをバインドし、または要素にそのイベントをトリガします。

この方法は、最初の2つのバリエーションでは.on("change", handler)のショートカットで、3番目のバリエーションでは.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

+0

@Sinetheta Hiya cooleosが少しトリミングします。 :) cheerios! –

+5

将来の参照のために、私はattrの後にトリガーを置く必要があったので、私のスクリプトはその変更が何であるかを見ました。 – Yohn

10

これは驚くべきことではありませんが、私はこのように非効果のリストin the msdnにすることができました。

  • "このイベントはコンテンツがコミットされたときに発生し、 の値が変更されているときには発生しません。"
  • "選択オブジェクトの 選択されたオプションがプログラムによって変更されると、onchangeイベントが発生しません。"

あなたはいつもちょうど.click()それjsFiddle

関連する問題