作者klern (灰)
看板Ajax
標題Re: [問題] removeEventListener 失敗?
時間Tue Jan 4 10:35:42 2011
謝謝原po
測了一陣子 似乎可以了 需要在反覆在測試一下
我剛剛失敗是因為 我在手勢結束gestureend函式的最後 又重新註冊gesturestart
document.getElementById("divID").addEventListener(
'gesturestart', a1 = $.shove(this.onGestureStart, this), false);
後來我是直接在程式的初始地方 直接指派函式給變數a1, a2, a3
a1 = $.shove(this.onGestureStart, this);
a2 = $.shove(this.onGestureChange, this);
a3 = $.shove(this.onGestureEnd, this);
所以註冊時的部份變成
document.getElementById("divID").addEventListener(
'gesturestart', a1, false);
document.getElementById("divID").addEventListener(
'gesturechange', a2, true);
document.getElementById("divID").addEventListener(
'gestureend', a3, true);
移除時
document.getElementById("divID").removeEventListener(
'gestureend', a3, true);
document.getElementById("divID").removeEventListener(
'gesturechange', a2, true);
document.getElementById("divID").removeEventListener(
'gesturestart', a1, false);
document.getElementById("divID").addEventListener(
'gesturestart', a1, false);
參考看看 我還要在多加測試有沒有問題
只是我還是有點不懂為何 在註冊(addEventListener)的地方指派
變數a1,a2,a3函式會出現問題, 我會來是直接把指派函式的部份拉到最前方才成功
※ 引述《sk1765 (鼎玉鉉)》之銘言:
: ※ 引述《klern (灰)》之銘言:
: : 大家好 目前遇到一點瓶頸 囧
: : 我寫一小段要偵測在行動裝置上手勢的事件
: : 但是最後的removeEventListener 似乎沒成功
: : 我在remove的那個function中 加了一段 alert 發現警告視窗數目會遞增
: : 例如第一次彈一個視窗 第二次就彈兩個
: : 想請問我是哪裡寫錯了嗎 謝謝
: : P.S. 裝置為iPad , $.shove式一個plugin傳入目前的this
: : document.getElementById(“divID”).addEventListener(‘gesturestart’,
: : $.shove(this.onGestureStart, this), false);
: : onGestureStart: function(e) {
: : e.preventDefault();
: : document.getElementById("divID").addEventListener('gesturechange',
: : $.shove(this.onGestureChange, this), true);
: : document.getElementById("divID").addEventListener('gestureend',
: : $.shove(this.onGestureEnd, this), true);
: : return false;
: : },
: : onGestureChange: function(e) {
: : e.preventDefault();
: : …
: : return false;
: : },
: : onGestureEnd: function(e) {
: : e.preventDefault();
: : alert('1');
: : document.getElementById("divID").removeEventListener('gestureend',
: : $.shove(this.onGestureEnd, this), true);
: : document.getElementById("divID").removeEventListener('gesturechange',
: : $.shove(this.onGestureChange, this), true);
: : document.getElementById("divID").removeEventListener('gesturestart',
: : $.shove(this.onGestureStart, this), false);
: : return false;
: : }
: 我大概搞懂你的問題出在哪了 就是那個$.shove
: addEventListener('gestureend',$.shove(this.onGestureEnd, this), true)
: 之所以可以繫結上event 是因為 $.shove(this.onGestureEnd, this)
: 回傳一個匿名function
: function() { return this.onGestureend.apply(this,e); } ->A
: 這個匿名function 繫結到了 gestureend事件
: 所以即使gestureend事件 不是直接執行 this.onGestureend 他仍然被跑到了
: 現在再來看
: removeEventListener('gestureend',$.shove(this.onGestureEnd, this), true)
: 他也繫結到了匿名function
: function() { return this.onGestureend.apply(this,e); } ->B
: 但是這個匿名function 跟addEventListener的那個 完全是兩個匿名function
: 因為用$.shove產生了兩次 A和B是不同的
: 所以只要想辦法刪到同一個匿名function就行了
: 以下是我的解法 多設幾個變數就行了
: document.getElementById(“divID”).addEventListener(‘gesturestart’,
: a1 = $.shove(this.onGestureStart, this), false);
: onGestureStart: function(e) {
: e.preventDefault();
: document.getElementById("divID").addEventListener('gesturechange',
: a2 = $.shove(this.onGestureChange, this), true);
: document.getElementById("divID").addEventListener('gestureend',
: a3 = $.shove(this.onGestureEnd, this), true);
: return false;
: },
: onGestureChange: function(e) {
: e.preventDefault();
: …
: return false;
: },
: onGestureEnd: function(e) {
: e.preventDefault();
: alert('1');
: document.getElementById("divID").removeEventListener('gestureend',
: a3, true);
: document.getElementById("divID").removeEventListener('gesturechange',
: a2, true);
: document.getElementById("divID").removeEventListener('gesturestart',
: a1, false);
: return false;
: }
: 以上請參考 若不能用在研究
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.204.7.152
1F:→ sk1765:因為你的event 函式都是寫成物件實字的方式 01/04 10:41
2F:→ sk1765:實字的method繫結 只有第一次有效 不過我很好奇這三個事件 01/04 10:42
3F:→ sk1765:是做什麼用的 因為沒玩過ipad 所以沒看過這種寫法 01/04 10:43
4F:→ klern:謝謝你 看來對javascript還不夠熟悉^^" 01/04 10:54
5F:→ klern:這個gesture event當你超過1之手指去touch時會觸發 01/04 10:55
6F:→ klern:這個event有2個property 1個是scale 1個是rotation 01/04 10:56
7F:→ klern:可以用來作縮放和旋轉 iPhone也有 Android就不清楚了 囧 01/04 10:58
註冊的地方 打錯 修正一下:p
※ 編輯: klern 來自: 123.204.7.152 (01/04 12:01)