bind
每次調用它時都會返回一個新的函數引用(這是它的工作:-)),並且如果函數引用是===
匹配,stopObserving
將只解除處理函數的綁定。
要解決此問題,請記住您作爲屬性綁定的事件處理程序,然後使用該屬性與stopObserving
。或者,如果您負責該元素,則可以通過簡單地關閉第三個參數來取消所有處理程序的mousemove
和mouseup
事件。 (請參閱鏈接的文檔以瞭解更多關於將參數設置爲stopObserving
的信息)。
因此,要麼:
initialize: function(element) {
this.element = element;
this.boundUpdateDrag = this.updateDrag.bind(this);
this.boundStopDrag = this.stopDrag.bind(this);
Event.observe(element, 'mousedown', function() {
// Off-topic, but see note at end of answer, unrelated bug here
Event.observe(window, 'mousemove', this.boundUpdateDrag);
Event.observe(window, 'mouseup', this.boundStopDrag);
});
},
stopDrag: function(event) {
console.log("stopping drag");
Event.stopObserving(window, 'mousemove', this.boundUpdateDrag);
Event.stopObserving(window, 'mouseup', this.boundStopDrag);
}
或者只是
stopDrag: function(event) {
console.log("stopping drag");
Event.stopObserving(window, 'mousemove');
Event.stopObserving(window, 'mouseup');
}
但要注意的是,後者移除了所有處理該元素在這些事件(當然,對那些通過原型掛鉤)。
題外話,但請注意,在你的initialize
功能的錯誤:它使用this
在處理程序mousedown
,但不保證this
設置爲它應該被設置爲。您需要綁定該匿名函數,或使用initialize
中的變量來利用匿名函數是閉包的事實。
如此反覆要麼使用綁定:
initialize: function(element) {
this.element = element;
this.boundUpdateDrag = this.updateDrag.bind(this);
this.boundStopDrag = this.stopDrag.bind(this);
Event.observe(element, 'mousedown', (function() {
Event.observe(window, 'mousemove', this.boundUpdateDrag);
Event.observe(window, 'mouseup', this.boundStopDrag);
}).bind(this));
},
或者使用你無論如何定義一個封閉的事實:
initialize: function(element) {
var self;
self = this; // Remember 'this' on a variable that will be in scope for the closure
this.element = element;
this.boundUpdateDrag = this.updateDrag.bind(this);
this.boundStopDrag = this.stopDrag.bind(this);
Event.observe(element, 'mousedown', function() {
// Note we're using 'self' rather than 'this'
Event.observe(window, 'mousemove', self.boundUpdateDrag);
Event.observe(window, 'mouseup', self.boundStopDrag);
});
},
高興的是幫助。我剛更新了我的答案,因爲我注意到'initialize'中的一個(無關的)錯誤,值得一看。 – 2010-04-02 16:35:54