24

現在、アプリケーションをアップグレードして jQuery 1.6.1 (以前は 1.4.4 を使用) を使用していましたが、.click()イベントが自動的にイベントをトリガーするように.change()なりました。

ここに簡単な例を作成しました: http://jsfiddle.net/wDKPN/

1.4.4 を含めると、イベントがトリガーされたときに.change()関数が起動しないことに注意してください。.click()しかし、1.6 に切り替えると、がトリガーされたときに.change()イベントが発生します。.click()

2 つの質問:

  1. これはバグですか? プログラムによるトリガーは、他のイベントも発生させる.click() べきではないようです (たとえば、ユーザーのクリックを「模倣」するために、自動的に発生する.blur()andも間違っているように思われます)。.focus()

  2. change()イベントをバインドし、その要素のイベントとイベントの両方トリガーする適切な方法は何ですか? click()change() 単に を呼び出し.click()て、 も起動するという事実に依存し.change()ますか?

    $('#myelement').change(function() {
         // do some stuff
    });
    
    $('#myelement').click(); // both click and change will fire, yay!
    

私の古いコードでは、このパターンを使用して、ajax 呼び出しの後にいくつかのチェックボックス (およびチェックされた状態と値) を初期化しています。

    $('#myelement').change(function() {
         // do some stuff including ajax work
    }).click().change();

しかし、1.6.1 では、私のロジックは 2 回起動します (1 回.click()と で 1 回.change())。トリガーを削除するだけ.change()で、将来のバージョンでも jQuery が引き続きこのように動作することを期待できますか?

4

4 に答える 4

3

これを行う最良の方法は次のとおりです。

$('#myelement').bind('initCheckboxes change', function() {
     // do some stuff including ajax work
}).trigger('initCheckboxes');

初期化を行うには、ページが最初にロードされたときにトリガーするカスタム イベントをバインドするだけです。これは、どのバージョンでも誰もあなたから奪うことはありません。

一方change、イベントはすべてのバージョンで引き続き存在すると思います。これは非常に長い間存在しており、そのようにうまく機能しているためです.

最終的に、これはハッピー エンドの話です。カスタム イベントinitCheckboxesはページの読み込み時に 1 回だけ発生し、changeイベントは常にリッスンして状態の変更時に発生するためです。

于 2011-06-15T16:45:54.833 に答える
3

これは jQuery 1.4.4 のバグだと思います。jQuery イベント ハンドラを削除して標準を使用addEventListenerすると、jquery 1.6.1 と同じ結果になります。

http://jsfiddle.net/jruddell/wDKPN/26/

window.count = 0;

document.getElementById('mycheckbox').addEventListener('change', function() {
    window.count++;
    jQuery('#output').append('I fired: ' + window.count + ' times<br />');
});

document.getElementById('mycheckbox').click();

またtriggerHandler、jQuery イベント ハンドラーを具体的に呼び出すために使用します。イベント モデルで呼び出すハンドラーを決定する場合はclickchangeなどを使用します。

于 2011-06-15T16:58:03.127 に答える
2

チェックボックスのクリックイベントは忘れてください。change イベントはすべてを処理します。

$('#myelement').change(function() {
    // do some stuff
});
$('#myelement').trigger('change');

http://jsfiddle.net/zupa/UcwdT/ (このデモは jQuery 1.8 に設定されていますが、1.6 でも動作します) 。

于 2012-12-18T17:12:46.007 に答える
1

クリック ハンドラー内に change() を配置してからクリックをトリガーすることで、jQuery 1.4.4 と 1.6 の両方の実装で機能させることができると思います。

$('.myelement').click(function(){
 $('.myelement').change();   
 alert($(this).val());
});
$('.myelement').trigger('click');

簡単な例については、そこをご覧ください。

于 2011-06-14T23:44:48.310 に答える