我有以下看法
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"
},
没关系的,我很好
你怎么了?
5条答案
按热度按时间vof42yt11#
我不认为
body
元素会触发scroll事件,除非您通过在CSS中将overflow
属性设置为scroll
来显式地给予它一个滚动条。当用户滚动到元素中的不同位置时,scroll事件将被发送到该元素。它适用于窗口对象,但也适用于可滚动框架和溢出CSS属性设置为scroll(或当元素的显式高度或宽度小于其内容的高度或宽度时设置为auto)的元素。
假设您没有显式地为
body
元素提供overflow:scroll
和/或固定高度的滚动条,那么您要侦听的scroll
事件可能是由window
对象触发的,而不是由body
触发的。我认为这里最好的方法是删除Backbone事件绑定(这实际上只是一种简写,只适用于
view.el
元素中的事件),并直接绑定到initialize()
中的窗口:rpppsulh2#
我认为问题在于Backbone使用事件委托来捕获事件,也就是说,它将监听器附加到
this.$el
,并且scroll
事件没有根据定义冒泡。因此,如果scroll
事件发生在this.$el
的子(或后代)上,则在this.$el
上无法观察到该事件。它对
click
有效的原因,只是因为click
冒泡了。ltqd579y3#
body和window的滚动条是不同的,你必须确保你没有在window对象上滚动。这里有一个jsfiddle说明你可能遇到的问题。
jsfiddle
我不确定是否可以将'el'改为document.window对象,但我认为这不是一个好的解决方案。我认为最好的办法是使用CSS,就像我在body元素中所做的那样,或者在body中创建一个div,并在body标签中引用该节。
祝你好运
kokeuurv4#
我遇到了同样问题,这是我实现它的方法
});变量myView =我的视图();
6yjfywim5#