【发布时间】:2015-02-25 15:22:41
【问题描述】:
编辑
根据HammerGithub page,此错误是由于Manager 泄漏,应在2.0.5 版本中修复-此版本不是在线构建的,但可以自己构建。更多信息可以找到here
================================================ ======
原问题:
================================================ ======
我们使用 Backbone 和 Hammer 2,backbone hammer plugin 和 hammer jquery plugin.
问题
当使用 domEvents 并且只有 1 个 A 的副本时,它可以正常工作。
但是,当做类似的事情时
var first = new A();
var second = new A();
hammer listeners 不适用于第二个视图。
note:
将click 事件添加到上面的列表时,first 和second 视图都会触发点击。所以这与锤子事件和事件委托有关。
任何想法如何克服这个问题?
谢谢!
橡木
P.S 一些代码(可在堆栈溢出中运行)
这是一些代码示例。可以看出 - swiperight 仅适用于第一个视图,而不适用于第二个视图。代码使用touch emulator,所以也可以用鼠标查看。
A = Backbone.View.extend({
hammerEvents: {
"panstart .js-feed-btn": "_onPan",
"panmove .js-feed-btn": "_onPan",
"swiperight .js-feed-btn": "_onSwipeRight",
"click .js-feed-btn-clickable": "_onClick"
},
hammerOptions: {
//tap: true,
domEvents: true
},
_onPan: function(e) {
this.$el.find('.status-bar').html('panning... ' + this.cid);
var view = this;
if (this._animate) {
return;
}
snabbt(e.target, {
position: [e.originalEvent.gesture.deltaX / 2, 0, 0],
duration: 100,
callback: function() {
this._animate = false;
}
})
},
_onSwipeRight: function(e) {
snabbt(e.target, {
position: [e.originalEvent.gesture.deltaX, 0, 0],
}).then({
position: [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() {
this.$el.html('<div class="js-feed-btn">swipe me right</div><div class="js-feed-btn-clickable">clickme</div><section class="status-bar"></section>');
return this;
},
});
var first = new A();
var second = new A();
var parent = new Backbone.View();
parent.$el.append(first.render().$el)
parent.$el.append(second.render().$el)
//$('.app').html(first.render().$el)
//$('.app').append(second.render().$el)
$('.app').html(parent.$el)
div {
min-height: 20px;
}
.status-bar {
background-color: green;
color: white;
}
<script src="https://rawgit.com/hammerjs/touchemulator/master/touch-emulator.js"></script>
<script>
TouchEmulator();
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<script src="https://hammerjs.github.io/dist/hammer.min.js"></script>
<script src="https://rawgit.com/jashkenas/underscore/master/underscore-min.js"></script>
<script src="https://rawgit.com/jashkenas/backbone/master/backbone-min.js"></script>
<script src="https://rawgit.com/hammerjs/jquery.hammer.js/master/jquery.hammer.js"></script>
<script src="https://rawgit.com/wookiehangover/backbone.hammer/master/backbone.hammer.js"></script>
<script src="https://rawgit.com/daniel-lundin/snabbt.js/master/snabbt.js"></script>
<section id="main">
<h3>Simple code</h3>
<section class="app"></section>
</section>
【问题讨论】:
-
我第一次遇到您的问题是为了寻找其他问题的答案。我已经重构了我的代码以使用backbone.hammer,并从在包含视图中使用一个Hammer 实例切换到在多次实例化的子视图类中设置Hammer。在桌面上的 Firefox 和 Chrome 中一切都很好,但是如果使用 Chrome 的开发工具来模仿 iPad(或 Nexus 等),或使用 真正的 iPad 或 Nexus 7、我也有同样的问题!只有第一个实例有效!我必须追根究底。你有想过吗?
-
一个更简单的例子(没有
jquery.hammer或backbone.hammer)可以在这里找到同样的问题:stackoverflow.com/questions/28016312/… - 不幸的是,它也没有答案。
标签: javascript backbone.js backbone-views backbone-events hammer.js