2012-07-23 126 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 2012-07-23 14:37:05

回答

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

我不得不使用'bind()'和'unbind()'而不是'on()'和'off()',但是這種方法運行良好。謝謝! – FtDRbwLXw6 2012-07-23 13:33:22

+0

是的,如果你堅持使用舊版本的jQuery(傳遞一個對象到'bind'也應該可以)。命名空間事件已經在jQuery 1.2中引入,所以絕對應該工作:)快樂編碼! – 2012-07-23 13:35:03