0

私はこのスクリプトを持っています:

<script>
    $(document).ready(function() {
       $('.block-link').click(function() {
          $('body').addClass("gallery-on");
       });

       $('body').delegate('.ps-toolbar-close', 'click', function() {
          $('body').removeClass("gallery-on");
          });
       });
</script>

スクリプトは、任意のをクリックし.gallery-onbodyときにクラスを追加することになっています.block-link
この.ps-toolbar-close要素は、いずれかがクリックされたときにモーダル ライトボックスを作成するプラグイン(かなり良いです!) を介して生成されます。.block-link

スクリプトの最初の部分は機能しており、2 番目の部分は.gallery-onボディからクラスを削除することになっていますが、ライトボックスを閉じて、ボディ クラスをそのままにしておきます。

私は何を間違っていますか?残念ながら、私はjavascriptとjqueryの初心者です..

私の最善の推測は.ps-toolbar-close、ページが読み込まれたときにドキュメントにまだ存在しないため、スクリプトの 2 番目の部分にクリック ハンドラが配置されて.delegate()いないことです。まだ存在しない要素を処理できると思っていましたが、間違っていますか?

助けてくれてありがとう!

4

1 に答える 1

0

これはおそらく、デリゲート メソッドの興味深いプロパティによるものです。jQueryのドキュメントから:

その他の注意事項:

.live() メソッドは、ドキュメントの先頭に伝播したイベントを処理するため、ライブ イベントの伝播を停止することはできません。同様に、.delegate() によって処理されるイベントは、委任先の要素に伝達されます。DOM ツリー内のその下の要素にバインドされたイベント ハンドラーは、委任されたイベント ハンドラーが呼び出されるまでに既に実行されています。したがって、これらのハンドラーは、event.stopPropagation() を呼び出すか、false を返すことによって、委任されたハンドラーがトリガーされるのを防ぐことができます。

モーダル ダイアログの close メソッドが DOM の下部にアタッチされており、ボディ ハンドラーの前に呼び出されているため、ハンドラーが正しく起動されません。

ダイアログのclose イベントにバインドし、そこでクラスを削除してみてください。

于 2012-10-31T23:45:08.580 に答える