作者sk1765 (鼎玉铉)
看板Ajax
标题Re: [问题] removeEventListener 失败?
时间Tue Jan 4 00:40:09 2011
※ 引述《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: 211.74.226.117
1F:→ klern:谢谢 似乎不太行... 我确认一下有没有打错的地方 01/04 09:40
2F:→ sk1765:如果不行的话 把变数都单独写看看 都写在外面 01/04 10:24
3F:→ sk1765:a3 = $.shove(this.onGestureEnd, this) 还有a2,a1都写在 01/04 10:25
4F:→ sk1765:程式最上面 addEventListener 和 removeEventListener里面 01/04 10:28
5F:→ sk1765:只放变数 a1,a2,a3 再试看看 01/04 10:29
6F:→ sk1765:喔 这样也不行 变成this系结不到 变数必须写成实字里面 01/04 10:31
7F:推 klern:哈 谢谢 刚试了 目前看是可以 刚刚在回文XD 01/04 10:36