2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-09-06 10:50:21 +08:00
discourse/app/assets/javascripts/discourse/mixins/scrolling.js
2014-06-10 11:54:38 -04:00

68 lines
1.6 KiB
JavaScript

/**
This mixin adds support for being notified every time the browser window
is scrolled.
@class Scrolling
@extends Ember.Mixin
@namespace Discourse
@module Discourse
**/
Discourse.Scrolling = Em.Mixin.create({
/**
Begin watching for scroll events. By default they will be called at max every 100ms.
call with {debounce: N} for a diff time
@method bindScrolling
*/
bindScrolling: function(opts) {
opts = opts || {debounce: 100};
var self = this,
onScrollMethod = function() {
return Em.run.scheduleOnce('afterRender', self, 'scrolled');
};
if (opts.debounce) {
onScrollMethod = Discourse.debounce(onScrollMethod, opts.debounce);
}
Discourse.ScrollingDOMMethods.bindOnScroll(onScrollMethod, opts.name);
},
/**
Stop watching for scroll events.
@method unbindScrolling
*/
unbindScrolling: function(name) {
Discourse.ScrollingDOMMethods.unbindOnScroll(name);
}
});
/**
This object provides the DOM methods we need for our Mixin to bind to scrolling
methods in the browser. By removing them from the Mixin we can test them
easier.
@class ScrollingDOMMethods
@module Discourse
**/
Discourse.ScrollingDOMMethods = {
bindOnScroll: function(onScrollMethod, name) {
name = name || 'default';
$(document).bind('touchmove.discourse-' + name, onScrollMethod);
$(window).bind('scroll.discourse-' + name, onScrollMethod);
},
unbindOnScroll: function(name) {
name = name || 'default';
$(window).unbind('scroll.discourse-' + name);
$(document).unbind('touchmove.discourse-' + name);
}
};