Skip to content

Instantly share code, notes, and snippets.

@blia
Created June 15, 2015 14:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blia/ece07e21414c157b82c5 to your computer and use it in GitHub Desktop.
Save blia/ece07e21414c157b82c5 to your computer and use it in GitHub Desktop.
import Ember from 'ember';
/*
Code modified from Addepar/ember-widgets
https://github.com/Addepar/ember-widgets/blob/master/src/mixins.coffee#L39
*/
var BodyEventListener = Ember.Mixin.create({
bodyElementSelector: 'html',
bodyClick: Ember.K,
bodyDragEnter: Ember.K,
bodyDragLeave: Ember.K,
bodyDragOver: Ember.K,
bodyDrop: Ember.K,
init: function () {
this._super();
return Ember.run.next(this, this._setupDocumentHandlers);
},
willDestroy: function () {
this._super();
return this._removeDocumentHandlers();
},
_setupDocumentHandlers: function () {
if (this._clickHandler && this._dragEnterHandler && this._dragLeaveHandler && this._dragOverHandler && this._dropHandler) {
return;
}
var self = this;
this._clickHandler = function (evt) {
return self.bodyClick(evt);
};
this._dragEnterHandler = function (evt) {
return self.bodyDragEnter(evt);
};
this._dragLeaveHandler = function (evt) {
return self.bodyDragLeave(evt);
};
this._dragOverHandler = function (evt) {
return self.bodyDragOver(evt);
};
this._dropHandler = function (evt) {
return self.bodyDrop(evt);
};
Ember.$(this.get('bodyElementSelector')).on('click', this._clickHandler);
Ember.$(this.get('bodyElementSelector')).on('dragenter', this._dragEnterHandler);
Ember.$(this.get('bodyElementSelector')).on('dragleave', this._dragLeaveHandler);
Ember.$(this.get('bodyElementSelector')).on('dragover', this._dragOverHandler);
Ember.$(this.get('bodyElementSelector')).on('drop', this._dropHandler);
},
_removeDocumentHandlers: function () {
Ember.$(this.get('bodyElementSelector')).off('click', this._clickHandler);
Ember.$(this.get('bodyElementSelector')).off('dragenter', this._dragEnterHandler);
Ember.$(this.get('bodyElementSelector')).on('dragleave', this._dragLeaveHandler);
Ember.$(this.get('bodyElementSelector')).off('dragover', this._dragOverHandler);
Ember.$(this.get('bodyElementSelector')).off('drop', this._dropHandler);
this._clickHandler = null;
this._dragEnterHandler = null;
this._dragLeaveHandler = null;
this._dragOverHandler = null;
this._dropHandler = null;
},
/*
http://stackoverflow.com/questions/152975/how-to-detect-a-click-outside-an-element
*/
click: function (event) {
return event.stopPropagation();
}
});
export default BodyEventListener;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment