2012-07-23 5 views
20

ドラッグ&ドロップイベントをバインドしたいページがあります。ブラウザのページ全体をドロップターゲットにしたいので、イベントをdocumentオブジェクトにバインドしました。私のアプリケーションのコンテンツはAJAXを介してメインコンテンツエリアにロードされていますが、アップロードページが現在表示されている場合にのみこれらのイベントハンドラをアクティブにしたいと思います。イベントハンドラが既に存在しない場合にのみバインドできますか?

今、アップロードページが取得されるときにイベントハンドラをバインドします。ただし、アップロードページがアクティブになるたびに、新しいイベントハンドラがバインドされます。これにより、ユーザーがアップロードページに移動してから離れるとハンドラが複数回起動します。私はバインドされていないときにのみハンドラをバインドさせることができれば、これを解決できると思っていました。これが可能ですか、よりよい選択肢が見落とされていますか?

関連するコード、それは場合に役立ちます:

$(document).bind('dragenter', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('dragover', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('drop', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
    self._handleFileSelections(e.originalEvent.dataTransfer.files); 
}); 
+0

[jQueryのチェックイベントは、要素上に存在する場合]の可能複製(http://stackoverflow.com/questions/1515069/jquery-check-if-event-exists-on-要素) – dgw

答えて

27

アンバインド既存のイベントハンドラを使用すると、新しいものをバインドする前に。これはnamespaced events [docs]と本当に簡単です:

$(document) 
    .off('.upload') // remove all events in namespace upload 
    .on({ 
     'dragenter.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     'dragover.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     // ... 
    }); 
+2

私は 'on()'と 'off()'の代わりに 'bind()'と 'unbind()'を使わなければなりませんでしたが、このメソッドはうまくいきました。ありがとう! – FtDRbwLXw6

+0

はい、以前のバージョンのjQueryに慣れている場合(オブジェクトを 'bind'に渡してもうまくいくはずです)。名前空間のイベントがjQuery 1.2で導入されたので、間違いなく動作するはずです:)ハッピーコーディング! –