我有以下观点
var FullWindow = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'detect_scroll');
},
// bind the events
events : {
"scroll" : "detect_scroll"
},
detect_scroll: function() {
console.log('detected');
}
});
我通过
初始化它var full_window = new FullWindow({el:$('body')});
但我不认为它有效。
当我将事件更改为
时events : {
"click" : "detect_scroll"
},
没关系。
怎么了?
答案 0 :(得分:30)
我不认为body
元素会触发滚动事件,除非您通过在CSS中将其overflow
属性设置为scroll
来明确地为其指定滚动条。来自jQuery文档:
当用户滚动到元素中的其他位置时,滚动事件将发送到元素。它适用于窗口对象,也适用于可滚动框架和元素,其中溢出CSS属性设置为滚动(或当元素的显式高度或宽度小于其内容的高度或宽度时自动)。
假设您没有明确地为body
元素提供带有overflow:scroll
和/或固定高度的滚动条,那么您想要侦听的scroll
事件可能会被触发window
对象,而不是body
。
我认为这里最好的方法是删除Backbone事件绑定(这只是一个简写,只适用于view.el
元素中的事件)并直接绑定到initialize()
中的窗口:
initialize: function() {
_.bindAll(this, 'detect_scroll');
// bind to window
$(window).scroll(this.detect_scroll);
}
答案 1 :(得分:11)
我认为问题在于Backbone使用事件委派来捕获事件,即它将侦听器附加到this.$el
,并且scroll
事件不会按定义冒泡。
因此,如果scroll
的子(或后代)发生this.$el
事件,则this.$el
无法观察到此事件。
它适用于click
的原因,只是因为click
冒泡。
答案 2 :(得分:2)
正文和窗口的滚动条不同,您必须确保不在窗口对象上滚动。这是一个jsfiddle,说明了您可能遇到的问题。
我不确定你是否可以将'el'更改为document.window对象,但我认为无论如何这都不是一个好的解决方案。我想说你最好的选择是使用CSS,就像我已经做过的那样,帮助你使用body元素或者在body中创建一个div并引用body标签。
祝你好运。答案 3 :(得分:0)
我有同样的问题,这就是我实施它的方式
var MyView = Backbone.View.extend({
el: $('body'),
initialize: function() {
$(window).scroll(function() {
if ($(window).scrollTop()!=0 && $(window).scrollTop() == $(document).height() - $(window).height()) {
if (mpListModel.get('next')) {
var res = confirm('Next page?');
if (res==true) {
myView.fetch()
}
}
}
});
},
events: {},
fetch: function() {
//fetch stuff
}
}); var myView = MyView();
答案 4 :(得分:0)
afterRender: function() {
// <div id="page-content" class="page-content"> la class qui contiens le scroll
var $scrollable = this.$el.find('.page-content');
$scrollable.scroll(function() {
alert("event scroll ");
});
},