Skip to content

Instantly share code, notes, and snippets.

@rabidaudio
Last active October 27, 2016 22:56
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 rabidaudio/03005ddc64cc99f84955 to your computer and use it in GitHub Desktop.
Save rabidaudio/03005ddc64cc99f84955 to your computer and use it in GitHub Desktop.
A little jQuery plugin for draggable selections, a la whenisgood.net
/**
* A simple little jQuery plugin for doing draggable selections (like http://whenisgood.net/).
* Maybe not super performant, but it's jQuery so you already don't care.
*
* Demo:
* http://jsfiddle.net/qa06oab2/
*
* Usage:
* $(<selector for elements>).dragHighlight(<optional name of class to add, defaults to 'selected'>);
*
* Author:
* Charles Julian Knight, charles@rabidaudio.com
*
* License:
* MIT
*/
(function ($) {
//http://stackoverflow.com/a/2700029
var disableSelection = function () {
return this.attr('unselectable', 'on')
.css('user-select', 'none')
.on('selectstart', false);
};
var enableSelection = function () {
return this.attr('unselectable', 'off')
.css('user-select', 'inherit')
.off('selectstart');
};
var state = 'none';
function selectOrDeselect() {
if (state === 'select') {
$(this).addClass('selected');
} else if (state == 'deselect') {
$(this).removeClass('selected');
}
}
$.fn.dragHighlight = function (className) {
var self = this;
className = className || 'selected';
$(self).on('mouseover', selectOrDeselect).on('mousedown', function () {
//first element to get dragged
state = ($(this).hasClass(className) ? 'deselect' : 'select');
disableSelection.bind(self).call();
selectOrDeselect.bind(this).call();
$(self).first().trigger('dragHighlightStart', this, state);
//start listening for the end
$(document).on('mouseup', function () {
state = 'none';
enableSelection.bind(self).call();
$(document).off('mouseup');
$(self).first().trigger('dragHighlightEnd', state);
});
});
return self;
}
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment