-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjquery.dragToSelect.min.js
1 lines (1 loc) · 5.1 KB
/
jquery.dragToSelect.min.js
1
!function($){jQuery.fn.dragToSelect=function(conf){var realParent=jQuery(this),parent=realParent;do{if(/auto|scroll|hidden/.test(parent.css("overflow")))break;parent=parent.parent()}while(parent[0].parentNode);var c="object"==typeof conf?conf:{},config=jQuery.extend({className:"jquery-drag-to-select",classSelecting:"jquery-drag-to-select-selecting",activeClass:"active",disabledClass:"disabled",selectedClass:"selected",scrollTH:10,percentCovered:25,selectables:!1,autoScroll:!1,selectOnMove:!1,onShow:function(){return!0},onHide:function(){return!0},onRefresh:function(){return!0}},c);if("disable"==conf)return parent.addClass(config.disabledClass),this;if("enable"==conf)return parent.removeClass(config.disabledClass),this;var parentOffset=parent.offset(),parentDim={left:parentOffset.left,top:parentOffset.top,width:parent.outerWidth(),height:parent.outerHeight()},selectBoxOrigin={left:0,top:0},selectBox=jQuery("<div/>").appendTo(parent).attr("class",config.className).css("position","absolute"),showSelectBox=function(e){if(!parent.is("."+config.disabledClass)){selectBoxOrigin.left=e.pageX-parentDim.left+parent[0].scrollLeft,selectBoxOrigin.top=e.pageY-parentDim.top+parent[0].scrollTop;var css={left:selectBoxOrigin.left+"px",top:selectBoxOrigin.top+"px",width:"1px",height:"1px"};selectBox.addClass(config.activeClass).css(css),config.onShow()}},refreshSelectBox=function(e){if(selectBox.is("."+config.activeClass)&&!parent.is("."+config.disabledClass)){var left=e.pageX-parentDim.left+parent[0].scrollLeft,top=e.pageY-parentDim.top+parent[0].scrollTop,newLeft=left,newTop=top,newWidth=selectBoxOrigin.left-newLeft,newHeight=selectBoxOrigin.top-newTop;left>selectBoxOrigin.left&&(newLeft=selectBoxOrigin.left,newWidth=left-selectBoxOrigin.left),top>selectBoxOrigin.top&&(newTop=selectBoxOrigin.top,newHeight=top-selectBoxOrigin.top);var css={left:newLeft+"px",top:newTop+"px",width:newWidth+"px",height:newHeight+"px"};selectBox.css(css),config.onRefresh()}},hideSelectBox=function(e){selectBox.is("."+config.activeClass)&&!parent.is("."+config.disabledClass)&&config.onHide(selectBox)!==!1&&selectBox.removeClass(config.activeClass)},scrollPerhaps=function(e){selectBox.is("."+config.activeClass)&&!parent.is("."+config.disabledClass)&&(e.pageY+config.scrollTH>parentDim.top+parentDim.height&&(parent[0].scrollTop+=config.scrollTH),e.pageY-config.scrollTH<parentDim.top&&(parent[0].scrollTop-=config.scrollTH),e.pageX+config.scrollTH>parentDim.left+parentDim.width&&(parent[0].scrollLeft+=config.scrollTH),e.pageX-config.scrollTH<parentDim.left&&(parent[0].scrollLeft-=config.scrollTH))},selectElementsInRange=function(){if(selectBox.is("."+config.activeClass)&&!parent.is("."+config.disabledClass)){var selectables=realParent.find(config.selectables),selectBoxOffset=selectBox.offset(),selectBoxDim={left:selectBoxOffset.left,top:selectBoxOffset.top,width:selectBox.width(),height:selectBox.height()};selectables.each(function(i){var el=$(this),elOffset=el.offset(),elDim={left:elOffset.left,top:elOffset.top,width:el.width(),height:el.height()};percentCovered(selectBoxDim,elDim)>config.percentCovered?el.addClass(config.selectedClass):el.removeClass(config.selectedClass)})}},percentCovered=function(dim1,dim2){if(dim1.left<=dim2.left&&dim1.top<=dim2.top&&dim1.left+dim1.width>=dim2.left+dim2.width&&dim1.top+dim1.height>dim2.top+dim2.height)return 100;dim1.right=dim1.left+dim1.width,dim1.bottom=dim1.top+dim1.height,dim2.right=dim2.left+dim2.width,dim2.bottom=dim2.top+dim2.height;var l=Math.max(dim1.left,dim2.left),r=Math.min(dim1.right,dim2.right),t=Math.max(dim1.top,dim2.top),b=Math.min(dim1.bottom,dim2.bottom);if(b>=t&&r>=l){var percent=(r-l)*(b-t)/(dim2.width*dim2.height)*100;return percent}return 0};selectBox.mousemove(function(e){refreshSelectBox(e),config.selectables&&config.selectOnMove&&selectElementsInRange(),config.autoScroll&&scrollPerhaps(e),e.preventDefault()}).mouseup(function(e){config.selectables&&selectElementsInRange(),hideSelectBox(e),e.preventDefault()}),jQuery.fn.disableTextSelect&&parent.disableTextSelect();var mousemove=function(e){parentOffset=parent.offset(),parentDim={left:parentOffset.left,top:parentOffset.top,width:parent.outerWidth(),height:parent.outerHeight()},refreshSelectBox(e),config.selectables&&config.selectOnMove&&selectElementsInRange(),config.autoScroll&&scrollPerhaps(e),e.preventDefault()},mouseup=function(e){config.selectables&&selectElementsInRange(),hideSelectBox(e),$(document.body).off("mousemove",mousemove),$(document.body).off("mouseup",mouseup),parent.removeClass(config.classSelecting),e.preventDefault()};return parent.mousedown(function(e){1==e.which&&(parentOffset=parent.offset(),parentDim={left:parentOffset.left,top:parentOffset.top,width:parent.outerWidth(),height:parent.outerHeight()},e.pageX-parentDim.left+parent.scrollLeft()>parent.innerWidth()||e.pageY-parentDim.top+parent.scrollTop()>parent.innerHeight()||(parent.addClass(config.classSelecting),$("."+config.className).length<=0&&(selectBox=jQuery("<div/>").appendTo(parent).attr("class",config.className).css("position","absolute")),$(document.body).on("mousemove",mousemove),$(document.body).on("mouseup",mouseup),showSelectBox(e),e.preventDefault()))}),this}}(jQuery);