Skip to content

Commit ac9405e

Browse files
committed
Merge pull request #12059 from rwjblue/opt-out-events
[BUGFIX canary] Honor `customEvents` opting out of event listeners.
2 parents e7b807c + acbb0b2 commit ac9405e

File tree

3 files changed

+88
-9
lines changed

3 files changed

+88
-9
lines changed

packages/ember-application/lib/system/application.js

+30-1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ var librariesRegistered = false;
123123
});
124124
```
125125
126+
To prevent Ember from setting up a listener for a default event,
127+
specify the event name with a `null` value in the `customEvents`
128+
property:
129+
130+
```javascript
131+
var App = Ember.Application.create({
132+
customEvents: {
133+
// prevent listeners for mouseenter/mouseleave events
134+
mouseenter: null,
135+
mouseleave: null
136+
}
137+
});
138+
```
139+
126140
By default, the application sets up these event listeners on the document
127141
body. However, in cases where you are embedding an Ember application inside
128142
an existing page, you may want it to set up the listeners on an element
@@ -243,7 +257,11 @@ var Application = Namespace.extend(RegistryProxy, {
243257
If you would like additional bubbling events to be delegated to your
244258
views, set your `Ember.Application`'s `customEvents` property
245259
to a hash containing the DOM event name as the key and the
246-
corresponding view method name as the value. For example:
260+
corresponding view method name as the value. Setting an event to
261+
a value of `null` will prevent a default event listener from being
262+
added for that event.
263+
264+
To add new events to be listened to:
247265
248266
```javascript
249267
var App = Ember.Application.create({
@@ -254,6 +272,17 @@ var Application = Namespace.extend(RegistryProxy, {
254272
});
255273
```
256274
275+
To prevent default events from being listened to:
276+
277+
```javascript
278+
var App = Ember.Application.create({
279+
customEvents: {
280+
// remove support for mouseenter / mouseleave events
281+
mouseenter: null,
282+
mouseleave: null
283+
}
284+
});
285+
```
257286
@property customEvents
258287
@type Object
259288
@default null

packages/ember-views/lib/system/event_dispatcher.js

+27-8
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import EmberObject from 'ember-runtime/system/object';
1212
import jQuery from 'ember-views/system/jquery';
1313
import ActionManager from 'ember-views/system/action_manager';
1414
import View from 'ember-views/views/view';
15-
import merge from 'ember-metal/merge';
15+
import assign from 'ember-metal/assign';
1616

1717
/**
1818
`Ember.EventDispatcher` handles delegating browser events to their
@@ -29,12 +29,29 @@ export default EmberObject.extend({
2929

3030
/**
3131
The set of events names (and associated handler function names) to be setup
32-
and dispatched by the `EventDispatcher`. Custom events can added to this list at setup
33-
time, generally via the `Ember.Application.customEvents` hash. Only override this
34-
default set to prevent the EventDispatcher from listening on some events all together.
32+
and dispatched by the `EventDispatcher`. Modifications to this list can be done
33+
at setup time, generally via the `Ember.Application.customEvents` hash.
3534
36-
This set will be modified by `setup` to also include any events added at that time.
35+
To add new events to be listened to:
3736
37+
```javascript
38+
var App = Ember.Application.create({
39+
customEvents: {
40+
paste: 'paste'
41+
}
42+
});
43+
```
44+
45+
To prevent default events from being listened to:
46+
47+
```javascript
48+
var App = Ember.Application.create({
49+
customEvents: {
50+
mouseenter: null,
51+
mouseleave: null
52+
}
53+
});
54+
```
3855
@property events
3956
@type Object
4057
@private
@@ -129,9 +146,7 @@ export default EmberObject.extend({
129146
*/
130147
setup(addedEvents, rootElement) {
131148
var event;
132-
var events = get(this, 'events');
133-
134-
merge(events, addedEvents || {});
149+
var events = assign({}, get(this, 'events'), addedEvents);
135150

136151
if (!isNone(rootElement)) {
137152
set(this, 'rootElement', rootElement);
@@ -172,6 +187,10 @@ export default EmberObject.extend({
172187
var self = this;
173188
var viewRegistry = this.container && this.container.lookup('-view-registry:main') || View.views;
174189

190+
if (eventName === null) {
191+
return;
192+
}
193+
175194
rootElement.on(event + '.ember', '.ember-view', function(evt, triggeringManager) {
176195
var view = viewRegistry[this.id];
177196
var result = true;

packages/ember-views/tests/system/event_dispatcher_test.js

+31
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,34 @@ QUnit.test('additional events and rootElement can be specified', function () {
312312

313313
jQuery('#leView').trigger('myevent');
314314
});
315+
316+
QUnit.test('default events can be disabled via `customEvents`', function () {
317+
expect(1);
318+
319+
run(function () {
320+
dispatcher.setup({
321+
click: null
322+
});
323+
324+
view = View.create({
325+
elementId: 'leView',
326+
327+
null() {
328+
// yes, at one point `click: null` made an event handler
329+
// for `click` that called `null` on the view
330+
ok(false, 'null event has been triggered');
331+
},
332+
333+
click() {
334+
ok(false, 'click event has been triggered');
335+
},
336+
337+
doubleClick() {
338+
ok(true, 'good event was still triggered');
339+
}
340+
}).appendTo(dispatcher.get('rootElement'));
341+
});
342+
343+
jQuery('#leView').trigger('click');
344+
jQuery('#leView').trigger('dblclick');
345+
});

0 commit comments

Comments
 (0)