自写jQuery框选Selector

/**

  name:selector.js
  component:jQuery Selector
  version:0.0.1
  autor:fight
  date:2010年6月26日15:14:06
**/

(function($) {
 
 var initSelector = function(container) {
  if(typeof container._init == 'undefined') {
   new selector(container).init();
  }
 };
 
 function selector(container) {
  return {
   options : {
    container:container,
    selected:new Array(),
    target : new Array(),
    area : {startX:10000,startY:10000,endX:0,endY:0},
    x_firstSelected : null,
    x_lastSelected : null,
    y_firstSelected : null,
    y_lastSelected : null,
    x_spacing : 0,
    y_spacing : 0
   },
   createDrawRect : function() {
    var _this = this;
    $(this.options.container).css('position','absolute');
    if(typeof this.options.container._init == 'undefined') {
     var drawRect = $('<div><div class="rectHelp"></div></div>').addClass('drawRect');
     $(this.options.container).append(drawRect);
     this.options.container.drawRect = drawRect;
     this.options.container._init = true;
     this.options.container.isDragSelection = false;
     this.options.container.dragSelectStartX = 0;
     this.options.container.dragSelectStartY = 0;
     this.options.container.selector = _this;
     drawRect.bind('mousedown',function(e){return false;}).bind('dblclick',function(e){
      var temp = _this.getSelectedObj();
      for(var index in temp) {
       temp[index].children('img').trigger('dblclick');
      }
     })
     .draggable({containment:$(container),
      start : function(event,ui) {
//       this.startX = $(this).position().left;
//       this.startY = $(this).position().top;
       this.startX = event.clientX+document.documentElement.scrollLeft;
       this.startY = event.clientY+document.documentElement.scrollTop;
      },
      drag : function(event,ui) {
       if($(this).position().top <= 3) {
        this.offsetY = 0;
       } else {
        this.offsetY = event.clientY+document.documentElement.scrollTop - this.startY;
        this.startY = event.clientY+document.documentElement.scrollTop;
       }
       if($(this).position().left <= 3) {
        this.offsetX = 0;
       } else {
        this.offsetX = event.clientX+document.documentElement.scrollLeft - this.startX;
        this.startX = event.clientX+document.documentElement.scrollLeft;
       }
       _this.translation(this.offsetX,this.offsetY);
      },
      stop : function(event,ui) {
//       alert($(this).position().top+","+$(this).position().left);
//       this.offsetX = $(this).position().left - this.startX;
//       this.offsetY = $(this).position().top - this.startY;
//       _this.translation(this.offsetX,this.offsetY);
      }
     });
     $(this.options.container).bind('mousedown',function(e) {
      var evt = e || window.event;
//      var startX = this.drawRect.offset().left;
//      var startY = this.drawRect.offset().top;
//      var endX = this.drawRect.offset().left + this.drawRect.width();
//      var endY = this.drawRect.offset().top + this.drawRect.height();
//      
//      if(this.drawRect.css('display') != 'none') {
//       if(evt.clientX>startX && evt.clientX<endX && evt.clientY>startY && evt.clientY<endY)
//       return false;
//      }
      this.drawRect.hide().width(0).height(0);
      this.isDragSelection = true;
      this.dragSelectStartX = evt.clientX+document.documentElement.scrollLeft-$(this).offset().left;
      this.dragSelectStartY = evt.clientY+document.documentElement.scrollTop-$(this).offset().top;
      _this.removeSelectTarget();
      return false;
     }).bind('mousemove',function(e) {
      if(this.isDragSelection) {
       var evt = e || window.event;
       var currentX = evt.clientX+document.documentElement.scrollLeft-$(this).offset().left-1;
       var currentY = evt.clientY+document.documentElement.scrollTop-$(this).offset().top-1;
       var boxStartX = this.dragSelectStartX < currentX ? this.dragSelectStartX:currentX;
       var boxStartY = this.dragSelectStartY < currentY ? this.dragSelectStartY:currentY;
       var boxWidth = Math.abs(this.dragSelectStartX - currentX);
       var boxHeight = Math.abs(this.dragSelectStartY - currentY);
       this.drawRect.css({width:boxWidth,height:boxHeight,top:boxStartY,left:boxStartX}).show();
      }
      //return false;
     }).bind('mouseup',function(e) {
      if(this.isDragSelection) {
       var evt = e || window.event;
       this.isDragSelection = false;
       var area = {};
       area.startX = this.drawRect.offset().left;
       area.startY = this.drawRect.offset().top;
       area.endX = this.drawRect.offset().left + this.drawRect.width();
       area.endY = this.drawRect.offset().top + this.drawRect.height();
       _this.getSelectTarget(area);
       return false;
      }
     }).bind('selectstart',function(e) {
      if(document.activeElement.tagName!='INPUT')
       return false;
     });
     drawRect.addContextMenu('drawRect',{
      bindings:{
       'align':function(t) {
        _this.adjustX();
       },
       'x_spacing' : function(t) {
        _this.adjustX_spacing(-1);
       }
      }
     });
     $(document).bind('mouseup',function(e) {
      if(_this.options.container.isDragSelection) {
       _this.options.container.isDragSelection = false;
       var area = {};
       area.startX = _this.options.container.drawRect.offset().left;
       area.startY = _this.options.container.drawRect.offset().top;
       area.endX = _this.options.container.drawRect.offset().left + _this.options.container.drawRect.width();
       area.endY = _this.options.container.drawRect.offset().top + _this.options.container.drawRect.height();
       _this.getSelectTarget(area);
       return false;
      }
     });
    }
   },
   init : function() {
    this.createDrawRect();
   },
   setTarget : function(obj) {
    obj = $(obj);
    obj.css('position','absolute');
    obj.bind('mousedown',function(e) {return false;});
    obj.css('zIndex',102);
    this.options.target.push(obj);
   },
   getSelectTarget : function(area) {
    var flag = false;
    var startX=10000,startY=10000,endX=0,endY=0;
    this.options.selected = new Array();
    for(var index=0;index<this.options.target.length;index++) {
     var obj = this.options.target[index];
     var position;
     if(this.isExitInSelectArea(obj,area)) {
      obj.addClass('selected');
      this.options.selected.push(obj);
      position = this.getPosition(obj);
      if(startX > position.startX) {
       startX = position.startX;
       this.options.x_firstSelected = obj;
      } else if(startX == position.startX) {
       if(this.getPosition(this.options.x_firstSelected).startY > position.startY) {
        this.options.x_firstSelected = obj;
       }
      }
      if(startY > position.startY) startY = position.startY;
      if(endX < position.endX) endX = position.endX;
      if(endY < position.endY) endY = position.endY;
      flag = true;
     }
    }
    if(flag === false) {
     this.options.container.drawRect.hide();
    } else {
     this.options.container.drawRect.css({left:startX-12,top:startY-12,width:endX-startX+20,height:endY-startY+20});
    }
    this.options.area = {startX:startX,startY:startY,endX:endX,endY:endY};
   },
   getSelectedObj : function() {
    return this.options.selected;
   },
   getXFirstSelected : function() {
    return this.options.x_firstSelected;
   },
   getXlastSelected : function() {
    return this.options.x_lastSelected;
   },
   getYFirstSelected : function() {
    return this.options.y_firstSelected;
   },
   getYlastSelected : function() {
    return this.options.y_lastSelected;
   },
   adjustX : function() {
    var selected = this.getSelectedObj();
    for(var index in selected) {
     var offsetY = this.getXFirstSelected().offset().top - selected[index].offset().top;
     selected[index].css('top',selected[index].position().top+offsetY);
     $(editor).data($(selected[index]).children('img').attr('id')).top += offsetY;
    }
    var area = {};
    area.startX = this.options.container.drawRect.offset().left;
    area.startY = this.options.container.drawRect.offset().top;
    area.endX = this.options.container.drawRect.offset().left + this.options.container.drawRect.width();
    area.endY = this.options.container.drawRect.offset().top + this.options.container.drawRect.height();
    this.getSelectTarget(area);
   },
   adjustX_spacing : function(x_spacing) {
    var selected = this.getSelectedObj();
    if(selected.length == 0) return;
    var flag = selected[0];
    flag.css('left',this.getXFirstSelected().position().left);
    $(editor).data(flag.children('img').attr('id')).left = $(editor).data(this.getXFirstSelected().children('img').attr('id')).left;
    for(var index in selected) {
     var obj = selected[index];
     if(flag == obj) continue;
     var temp = this.getPosition(flag),position = this.getPosition(obj);
     var offsetX = temp.endX + x_spacing - position.startX;
     obj.css('left',obj.position().left + offsetX);
     $(editor).data(obj.children('img').attr('id')).left += offsetX;
     flag = obj;
    }
    var area = {};
    area.startX = this.options.container.drawRect.offset().left;
    area.startY = this.options.container.drawRect.offset().top;
    area.endX = this.options.container.drawRect.offset().left + this.options.container.drawRect.width();
    area.endY = this.options.container.drawRect.offset().top + this.options.container.drawRect.height();
    this.getSelectTarget(area);
   },
   getPosition : function(obj) {
    var position = {}
    var startX = obj.offset().left-$(this.options.container).offset().left;
    var startY = obj.offset().top-$(this.options.container).offset().top;
    position.startX = startX;
    position.startY = startY;
    position.endX = startX+obj.width();
    position.endY = startY+obj.height();
    return position;
   },
   removeSelectTarget : function() {
    for(var index=0;index<this.options.target.length;index++) {
     var obj = this.options.target[index];
     if(obj.hasClass('selected')) {
      obj.removeClass('selected');
     }
    }
   },
   translation : function(offsetX,offsetY) {
    for(var index=0;index<this.options.target.length;index++) {
     var obj = this.options.target[index];
     if(obj.hasClass('selected')) {
      if(offsetY != 0) {
       obj.css('top',$(obj).position().top + offsetY);
      }
      if(offsetX != 0) {
       obj.css('left',$(obj).position().left + offsetX);
      }
      $(editor).data($(obj).children('img').attr('id')).top += offsetY;
      $(editor).data($(obj).children('img').attr('id')).left += offsetX;
//      if(editor.isEdited == 'true') {
//       $(editor).data($(obj).children('img').attr('id')).top = obj[0].offsetTop;
//       $(editor).data($(obj).children('img').attr('id')).left = obj[0].offsetLeft;
//      } else {
//       $(editor).data($(obj).children('img').attr('id')).top = obj[0].parentNode.offsetTop+obj[0].offsetTop;
//       $(editor).data($(obj).children('img').attr('id')).left = obj[0].parentNode.offsetLeft+obj[0].offsetLeft;
//      }
     }
    }
   },
   isExitInSelectArea : function(obj,area) {
    obj = $(obj);
    var objSX = obj.offset().left;
    var objSY = obj.offset().top;
    var objEX = objSX + obj.width();
    var objEY = objSY + obj.height();
    if(objSX>=area.startX && objSX<=area.endX && objSY>=area.startY && objSY<= area.endY  &&
       objEX>=area.startX && objEX<=area.endX && objEY>=area.startY && objEY<= area.endY) {
     return true;
    }
    return false;
   }
  };
 }
 
 $.fn.addSelector = function() {
  return this.each(function(){
   initSelector(this);
  });  
 };
 $.fn.setTarget = function(obj) {
  return this.each(function(){
   if(typeof this._init == 'undefined') {
    initSelector(this);
   }
   this.selector.setTarget(obj);
  }); 
 };
})(jQuery);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值