Skip to content

Commit

Permalink
feat(dragger): listen to mouse and touch, options to disable either
Browse files Browse the repository at this point in the history
  • Loading branch information
ajoslin committed Oct 6, 2013
1 parent 1506d03 commit 8776643
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/_main.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ angular.module('ajoslin.scrolly', [
var jqLite = angular.element,
copy = angular.copy,
forEach = angular.forEach,
isString = angular.isString;
isString = angular.isString,
extend = angular.extend;
22 changes: 19 additions & 3 deletions src/services/dragger.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ angular.module('ajoslin.scrolly.dragger', [])
* A factory for creating drag-listeners on elements.
*
* @param {element} element Element to attach drag listeners to.
* @param {object=} options Options object. Able to have the following properties:
* - **`mouse`** - {boolean=} - Whether to bind mouse events for this dragger. Default `true`.
* - **`touch`** - {boolean=} - Whether to bind touch events for this dragger. Default `true`.
*
* @returns {object} Newly created dragger object with the following properties:
*
Expand Down Expand Up @@ -153,6 +156,11 @@ angular.module('ajoslin.scrolly.dragger', [])

//Creates a dragger for an element
function $dragger(elm, options) {
options = extend({
mouse: true,
touch: true
}, options);

var self = {};
var raw = elm[0];
var listeners = {};
Expand Down Expand Up @@ -188,9 +196,17 @@ angular.module('ajoslin.scrolly.dragger', [])
}
};

elm.bind('touchstart', dragStart);
elm.bind('touchmove', dragMove);
elm.bind('touchend touchcancel', dragEnd);
if (options.touch) {
elm.bind('touchstart', dragStart);
elm.bind('touchmove', dragMove);
elm.bind('touchend touchcancel', dragEnd);
}
if (options.mouse) {
elm.bind('mousedown', dragStart);
elm.bind('mousemove', dragMove);
elm.bind('mouseup mouseout', dragEnd);
}

elm.bind('$destroy', function() {
delete listeners[DIRECTION_VERITCAL];
delete listeners[DIRECTION_HORIZONTAL];
Expand Down
48 changes: 48 additions & 0 deletions src/services/dragger.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,54 @@ describe('scrolly.dragger', function() {
$dragger = _$dragger_;
}));

describe('options', function() {
var elm, spy, d;
function setup(opts) {
elm = angular.element("<div>");
d = new $dragger(elm, opts);
spy = jasmine.createSpy();
d.addListener($dragger.DIRECTION_ANY, spy);
}
function trigger(elm, type) {
var e = $.Event(type);
e.pageX = e.pageY = 0;
$(elm[0]).trigger(e);
}
it('should mouse and touch by default', function() {
setup({});

trigger(elm, 'mousedown');
expect(spy).toHaveBeenCalled();
spy.reset();

trigger(elm, 'touchstart');
expect(spy).toHaveBeenCalled();
});
it('should not listen to mouse events with option', function() {
setup({
mouse: false
});

trigger(elm, 'mousedown');
expect(spy).not.toHaveBeenCalled();

trigger(elm, 'touchstart');
expect(spy).toHaveBeenCalled();
});
it('should not listen to touch events with option', function() {
setup({
touch: false
});

trigger(elm, 'mousedown');
expect(spy).toHaveBeenCalled();
spy.reset();

trigger(elm, 'touchstart');
expect(spy).not.toHaveBeenCalled();
});
});

makeTests('DIRECTION_HORIZONTAL');
makeTests('DIRECTION_VERTICAL');
makeTests('DIRECTION_ANY');
Expand Down
5 changes: 4 additions & 1 deletion src/services/scroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,10 @@ angular.module('ajoslin.scrolly.scroller', [

var raw = elm[0];
var transformer = self.transformer = new $transformer(elm);
var dragger = self.dragger = new $dragger(elm);
var dragger = self.dragger = new $dragger(elm, {
touch: true,
mouse: false
});
if (_supportDesktop) {
var desktopScroller = new $desktopScroller(elm, self);
}
Expand Down

0 comments on commit 8776643

Please sign in to comment.