Javascript Hammer事件委派和主干视图的重用 编辑

Javascript Hammer事件委派和主干视图的重用 编辑,javascript,backbone.js,backbone-views,backbone-events,hammer.js,Javascript,Backbone.js,Backbone Views,Backbone Events,Hammer.js,根据Hammer的说法,这个错误是由于Manager泄漏造成的,应该在2.0.5版本中修复-这个版本不是在线构建的,但是可以自己构建。可以找到更多信息 ===================================================== 原始问题: ===================================================== 我们正在使用,并且 问题 使用domEvents和A视图的一个副本时,它可以正常工作 但是,当你做这样的事情时 var

根据
Hammer
的说法,这个错误是由于
Manager
泄漏造成的,应该在
2.0.5
版本中修复-这个版本不是在线构建的,但是可以自己构建。可以找到更多信息

===================================================== 原始问题: ===================================================== 我们正在使用,并且

问题 使用
domEvents
A
视图的一个副本时,它可以正常工作

但是,当你做这样的事情时

var first = new A();
var second = new A();
锤式侦听器不适用于第二个视图

注意
: 将
click
事件添加到上面的列表时,将在
first
second
视图上触发单击。因此,这是一个关于锤击事件和事件授权的问题

有没有办法克服这个问题

谢谢

橡树

一些代码(可在堆栈溢出中运行) 下面是一些代码示例。可以看出,swiperight仅在第一个视图上工作,而在第二个视图上不工作。该代码使用,因此人们可以检查它与鼠标以及

A=Backbone.View.extend({
锤击事件:{
“panstart.js提要btn”:“\u onPan”,
“panmove.js提要btn”:“\u onPan”,
“swiperight.js提要btn”:“\u onswipright”,
“click.js feed btn clickable”:“\u onClick”
},
选择:{
//塔普:没错,
domEvents:没错
},
_onPan:函数(e){
this.el.find('.status bar').html('panning…'+this.cid);
var视图=此;
如果(这是动画){
返回;
}
障碍(如目标{
位置:[e.originalEvent.signature.deltaX/2,0,0],
持续时间:100,
回调:函数(){
这是。_animate=false;
}
})
},
_右上角:功能(e){
障碍(如目标{
位置:[e.originalEvent.signature.deltaX,0,0],
}).那么({
位置:[0,0,0]
})
this.el.find('.status bar').html('swiperight'+this.cid);
},
_onClick:function(){
this.el.find('.status bar').html('clicked'+this.cid);
},
render:function(){
这是。$el.html('swipe me rightclickme');
归还这个;
},
});
var first=新的A();
var second=新的A();
var parent=new Backbone.View();
父项$el.append(first.render().$el)
父项$el.append(second.render().$el)
//$('.app').html(first.render().$el)
//$('.app').append(second.render().$el)
$('.app').html(父项$el)
div{
最小高度:20px;
}
.状态栏{
背景颜色:绿色;
颜色:白色;
}

TouchEmulator();
简单代码

我认为这是一个bug,我已经找到了有问题的代码。我将在下周提交一个bug报告和请求(尽管我还不能确定我的解决方案是否会破坏其他东西)

问题是Hammer正在将所有侦听器添加到第一个元素中(这会意外地导致您为添加识别器的每个元素接收一个事件--add 4
press
listeners,并且每次按下都会调用您的回调4次)

我已经成功地使
滑动
事件生效(通过Chrome进行触摸设备模拟,以及正版iPad和Nexus 7)。还没有测试过其他事件

我只是将第946行(Hammer 2.0.4的)从

请注意,您可能需要对第878行进行相同的更改,但我还没有弄清楚在何处、何时或是否使用了
SingleTouchInput


正如我所说,我不确定这是否是一个合适的解决方案,但它肯定是一个解决方案。如果我发现任何问题或不良副作用,我会向您报告。

我第一次遇到您的问题是为了寻找其他问题的答案。此后,我将代码重构为使用backbone.hammer,并从在包含视图中使用一个hammer实例切换到在一个子视图类中设置hammer,该子视图类被多次实例化。Firefox和Chrome桌面上的一切都很好,但如果使用Chrome的开发工具来模仿iPad(或Nexus等),或者使用真正的iPad或Nexus7,我也会遇到同样的问题!只有第一个实例有效!我必须弄清这件事的真相。你有没有发现过这个问题?这里有一个更简单的例子(没有
jquery.hammer
backbone.hammer
),同样的问题:--不幸的是,它也还没有得到回答。有趣的发现。事实上,我有另一个关于hammerjs的bug,我还没有发布,我还没有尝试过你的修复,但它似乎也能解决我的第二个bug。一旦我测试了你的补丁的价值,我会尽快更新它,我还没有提交一个bug。一旦我开始工作,我的经理让我改变这个项目的优先顺序。等我回去做触控游戏的时候,我会再调查这件事的。
this.evTarget = TOUCH_TARGET_EVENTS;
this.evEl = TOUCH_TARGET_EVENTS;