2013-02-19 100 views
0

我試圖在jquery中智能地解除綁定事件,所以我可以輕鬆地啓用/禁用它們。我試圖避免使用狀態變量,因爲它不應該是必要的,它使我的共享功能非常混亂。以下是我最初嘗試過的方法,但沒有奏效。jQuery智能事件解除綁定

var dragStart = $('#ruler').mousedown(function(e){ 
    position = container.offset(); 
    mousePosition = { 
     x: e.pageX, 
     y: e.pageY 
    }; 

    var dragging = $(document).mousemove(function(e){ 
     var x = e.pageX - mousePosition.x; 
     var y = e.pageY - mousePosition.y; 

     container.offset({ 
      left: position.left + x, 
      top: position.top + y 
     }); 
    }); 

    var dragStop = $(document).mouseup(function(){ 
     dragStart.unbind(); 
     dragging.unbind(); 
     dragStop.unbind(); 
    }); 
}); 

我發現沒有工作,因爲jQuery的事件處理函數在選擇返回引用的元素,所以一切都正在從$(文件),這是在我的環境問題unbinded。

我知道我可以想出函數名並做一個有針對性的解除綁定,但是我必須做的所有不同的功能(不只是顯示),這會讓代碼很痛苦。有沒有什麼方法可以讓我的功能類似於上面代碼中的功能?我在想這件事:

var foo; 
$(<selector>).<eventType>(foo = function(){ 
    // DO SOMETHING 
    $(<unbind button>).click(function(){ 
     // foo.unbind(); 
     // OR 
     // $(<selector>).unbind(foo); 
     // ??????? 
    }); 
}); 

我甚至會打開創意解決方案。我現在可以開始工作,但我試圖看看我是否可以這樣做。謝謝!

+1

你應該使用'off'而不是'bind'並且你應該使用事件命名空間:http://docs.jquery.com/Namespaced_Events – vsync 2013-02-19 16:20:54

+0

如果你把它做成一個答案,我會投票爲了它。如果沒有,我會在一天之內自己發帖。 – Vap0r 2013-02-19 16:30:11

回答

2

您應該namespace你,讓你對他們更多的權力,所以如果說,你有委派事件click的一些王一路往上走的document像這樣一個方法事件:

$(document).on('click','a', doSomething); 

你可能會有更多這樣的情況,它會一直委託給主體,所以如果你想刪除其中的一個,那麼當你從文檔中解除綁定事件時,你實際上會殺死所有其他人。

更好的是:

$(document).on('click.someName','a', doSomething); // bind 
$(document).off('click.someName','a'); // unbind 

想象也有可能是它可能會使用事件代表團一路的documen,T或一些其他元素在頁面上更多的代碼,所以沒有命名空間會有一個勾結事件

+0

完美,謝謝。 – Vap0r 2013-02-19 17:08:20

+0

很高興幫助,因爲這個問題有點含糊不清:) – vsync 2013-02-19 17:12:07