2

jQuery プラグインCheckTreeを使用して、選択可能な項目のツリーを実装しようとしています。デモ ページ (上のリンク) には jQuery 1.2.6 が含まれています。ご想像のとおり、私のサイトにはもっと新しいものがあります。

試行錯誤の結果、デモが jQuery バージョン 1.5.2 以降で動作しなくなることが確認されました。興味深いことに、リリース ノートによると、jQuery 1.5.2 は単なるバグ修正リリースであり、重大な変更は導入されていません。私は問題を最も単純な形に煮詰めました:

<!DOCTYPE html>
<html lang="en-gb">
    <head>
        <meta charset="utf-8">
        <title>Breaking change in jQuery 1.5.2?</title>
    </head>
    <body>
        <input type="checkbox">
        <button>Click me</button>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js"></script>
        <script>
            $(function(){
                $(':checkbox').change(function(){ console.log('input checkbox change event'); });
                $("button").click(function(){
                    console.log('button clicked');
                    $(":checkbox").click();
                });
            });
        </script>
    </body>
</html>

jQuery 1.5.1 では、ボタンがクリックされたときにチェックボックスの変更イベントがトリガーされません。jQuery 1.5.2 では、change イベントトリガーされます。

別の言い方をすれば、jQuery 1.5.1 を使用している場合、ボタンをクリックすると、次のコンソール出力が表示されます。

button clicked

jQuery 1.5.2 を使用している場合、ボタンをクリックすると次のログが記録されます。

button clicked
input checkbox change event

この変更が行われた理由と、それを回避するためにできることを説明するドキュメントはありますか? プラグインでは、チェックボックスの変更イベントが によってトリガーされないようにする必要があります$(":checkbox").click()

4

2 に答える 2

0

回避策を実装しましたが、変更された動作のドキュメントを参照して、何が起こっているのかを理解したいと思っています。

この回避策は、上記の JavaScript を次のように書き換えることができるという事実に依存しています。

$(function(){
    $(':checkbox').bind('change',function(){ console.log('input checkbox change event'); });
    $("button").click(function(){
        console.log('button clicked');
        $(":checkbox").click();
    });
});

つまり、 に置き換えchange(fn)ましたbind('change',fn)。プラグインにはchange()、チェックボックスを明示的に呼び出す場所が 2 か所あるため、同様にtrigger('change').

ジグソーパズルの最後のピースは、changeイベントの名前を別の名前に変更することでしたfoo(これはもはやキーワードではなく単なる文字列であるため)。

イベント バインディングがfooではなくchangeに行われるようになったので、 を呼び出してclick()も、jQuery のどのバージョンでもイベントが発生することはありませんtrigger('foo')

于 2013-04-19T14:04:17.053 に答える