作者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)