Skip to content

Commit 1ca592a

Browse files
committed
feat(dragger): add option to stopPropagation, default false
1 parent 49c8093 commit 1ca592a

File tree

2 files changed

+49
-17
lines changed

2 files changed

+49
-17
lines changed

src/services/dragger.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ angular.module('ajoslin.scrolly.dragger', [])
107107
* @param {object=} options Options object. Able to have the following properties:
108108
* - **`mouse`** - {boolean=} - Whether to bind mouse events for this dragger. Default `true`.
109109
* - **`touch`** - {boolean=} - Whether to bind touch events for this dragger. Default `true`.
110+
* - **`stopPropagation**` - {boolean=} Whether to stop propagation of drag events. Default `false`.
110111
*
111112
* @returns {object} Newly created dragger object with the following properties:
112113
*
@@ -158,7 +159,8 @@ angular.module('ajoslin.scrolly.dragger', [])
158159
function $dragger(elm, options) {
159160
options = extend({
160161
mouse: true,
161-
touch: true
162+
touch: true,
163+
stopPropagation: false
162164
}, options);
163165

164166
var self = {};
@@ -208,9 +210,10 @@ angular.module('ajoslin.scrolly.dragger', [])
208210
}
209211

210212
elm.bind('$destroy', function() {
211-
delete listeners[DIRECTION_VERITCAL];
213+
delete listeners[DIRECTION_VERTICAL];
212214
delete listeners[DIRECTION_HORIZONTAL];
213215
delete listeners[DIRECTION_ANY];
216+
listeners = null;
214217
});
215218

216219
function dragStart(e) {
@@ -222,7 +225,8 @@ angular.module('ajoslin.scrolly.dragger', [])
222225
return;
223226
}
224227

225-
e.stopPropagation();
228+
options.stopPropagation && e.stopPropagation();
229+
226230
var point = e.touches ? e.touches[0] : e;
227231

228232
//No drag on ignored elements
@@ -243,7 +247,7 @@ angular.module('ajoslin.scrolly.dragger', [])
243247

244248
if (self.state.active) {
245249
e.preventDefault();
246-
e.stopPropagation();
250+
options.stopPropagation && e.stopPropagation();
247251

248252
var point = e.touches ? e.touches[0] : e;
249253
point = {x: point.pageX, y: point.pageY};
@@ -274,7 +278,7 @@ angular.module('ajoslin.scrolly.dragger', [])
274278

275279
if (self.state.active) {
276280
e = e.originalEvent || e; // for jquery
277-
e.stopPropagation();
281+
options.stopPropagation && e.stopPropagation();
278282

279283
self.state.updatedAt = Date.now();
280284
self.state.stopped = (self.state.updatedAt - self.state.startedAt) > _maxTimeMotionless;

src/services/dragger.spec.js

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,78 @@ describe('scrolly.dragger', function() {
99
}));
1010

1111
describe('options', function() {
12-
var elm, spy, d;
12+
var elm, dragSpy, d;
1313
function setup(opts) {
1414
elm = angular.element("<div>");
1515
d = new $dragger(elm, opts);
16-
spy = jasmine.createSpy();
17-
d.addListener($dragger.DIRECTION_ANY, spy);
16+
dragSpy = jasmine.createSpy();
17+
d.addListener($dragger.DIRECTION_ANY, dragSpy);
1818
}
19-
function trigger(elm, type) {
19+
function trigger(elm, type, options) {
2020
var e = $.Event(type);
2121
e.pageX = e.pageY = 0;
22+
angular.extend(e, options || {});
2223
$(elm[0]).trigger(e);
2324
}
25+
it('should not stop propagation by default', function() {
26+
setup({});
27+
var stopSpy = jasmine.createSpy('stop');
28+
trigger(elm, 'touchstart', {stopPropagation: stopSpy});
29+
expect(stopSpy).not.toHaveBeenCalled();
30+
trigger(elm, 'touchmove', {stopPropagation: stopSpy});
31+
expect(stopSpy).not.toHaveBeenCalled();
32+
trigger(elm, 'touchend', {stopPropagation: stopSpy});
33+
expect(stopSpy).not.toHaveBeenCalled();
34+
});
35+
it('should stop propagation with option', function() {
36+
setup({
37+
stopPropagation: true
38+
});
39+
var stopSpy = jasmine.createSpy('stop');
40+
41+
trigger(elm, 'touchstart', {stopPropagation: stopSpy});
42+
expect(stopSpy).toHaveBeenCalled();
43+
stopSpy.reset();
44+
45+
trigger(elm, 'touchmove', {stopPropagation: stopSpy});
46+
expect(stopSpy).toHaveBeenCalled();
47+
stopSpy.reset();
48+
49+
trigger(elm, 'touchend', {stopPropagation: stopSpy});
50+
expect(stopSpy).toHaveBeenCalled();
51+
});
2452
it('should mouse and touch by default', function() {
2553
setup({});
2654

2755
trigger(elm, 'mousedown');
28-
expect(spy).toHaveBeenCalled();
29-
spy.reset();
56+
expect(dragSpy).toHaveBeenCalled();
57+
dragSpy.reset();
3058

3159
trigger(elm, 'touchstart');
32-
expect(spy).toHaveBeenCalled();
60+
expect(dragSpy).toHaveBeenCalled();
3361
});
3462
it('should not listen to mouse events with option', function() {
3563
setup({
3664
mouse: false
3765
});
3866

3967
trigger(elm, 'mousedown');
40-
expect(spy).not.toHaveBeenCalled();
68+
expect(dragSpy).not.toHaveBeenCalled();
4169

4270
trigger(elm, 'touchstart');
43-
expect(spy).toHaveBeenCalled();
71+
expect(dragSpy).toHaveBeenCalled();
4472
});
4573
it('should not listen to touch events with option', function() {
4674
setup({
4775
touch: false
4876
});
4977

5078
trigger(elm, 'mousedown');
51-
expect(spy).toHaveBeenCalled();
52-
spy.reset();
79+
expect(dragSpy).toHaveBeenCalled();
80+
dragSpy.reset();
5381

5482
trigger(elm, 'touchstart');
55-
expect(spy).not.toHaveBeenCalled();
83+
expect(dragSpy).not.toHaveBeenCalled();
5684
});
5785
});
5886

0 commit comments

Comments
 (0)