jsp獲得一個區域內的所有div對象

1、創建js

Array.prototype.remove = function( item ){

 for( var i = 0 ; i < this.length ; i++ ){

  if( item == this[i] )

   break;

 }

 if( i == this.length )

  return;

 for( var j = i ; j < this.length - 1 ; j++ ){

  this[ j ] = this[ j + 1 ];

 }

 this.length--;

 }


String.prototype.replaceAll = function (AFindText,ARepText){ raRegExp = new RegExp(AFindText,"g"); return this.replace(raRegExp,ARepText);}

function getAllChildren(e) {

 return e.all ? e.all : e.getElementsByTagName('*');

}


document.getElementsBySelector = function(selector) {


 if (!document.getElementsByTagName) {

   return new Array();

 }

 var tokens = selector.split(' ');

 var currentContext = new Array(document);

 for (var i = 0; i < tokens.length; i++) {

   token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;

   if (token.indexOf('#') > -1) {


     var bits = token.split('#');

     var tagName = bits[0];

     var id = bits[1];

     var element = document.getElementById(id);

     if (tagName  &&  element.nodeName.toLowerCase() != tagName) {


       return new Array();

     }

     currentContext = new Array(element);

     continue;

   }

   if (token.indexOf('.') > -1) {


     var bits = token.split('.');

     var tagName = bits[0];

     var className = bits[1];

     if (!tagName) {

       tagName = '*';

     }


     var found = new Array;

     var foundCount = 0;

     for (var h = 0; h < currentContext.length; h++) {

       var elements;

       if (tagName == '*') {

           elements = getAllChildren(currentContext[h]);

       } else {

           elements = currentContext[h].getElementsByTagName(tagName);

       }

       for (var j = 0; j < elements.length; j++) {

         found[foundCount++] = elements[j];

       }

     }

     currentContext = new Array;

     var currentContextIndex = 0;

     for (var k = 0; k < found.length; k++) {

       if (found[k].className  &&  found[k].className.match(new RegExp('\\b'+className+'\\b'))) {

         currentContext[currentContextIndex++] = found[k];

       }

     }

     continue;

   }

   if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {

     var tagName = RegExp.$1;

     var attrName = RegExp.$2;

     var attrOperator = RegExp.$3;

     var attrValue = RegExp.$4;

     if (!tagName) {

       tagName = '*';

     }

     var found = new Array;

     var foundCount = 0;

     for (var h = 0; h < currentContext.length; h++) {

       var elements;

       if (tagName == '*') {

           elements = getAllChildren(currentContext[h]);

       } else {

           elements = currentContext[h].getElementsByTagName(tagName);

       }

       for (var j = 0; j < elements.length; j++) {

         found[foundCount++] = elements[j];

       }

     }

     currentContext = new Array;

     var currentContextIndex = 0;

     var checkFunction;

     switch (attrOperator) {

       case '=':

         checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };

         break;

       case '~':

         checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };

         break;

       case '|':

         checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };

         break;

       case '^':

         checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };

         break;

       case '$':

         checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };

         break;

       case '*':

         checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };

         break;

       default :

         checkFunction = function(e) { return e.getAttribute(attrName); };

     }

     currentContext = new Array;

     var currentContextIndex = 0;

     for (var k = 0; k < found.length; k++) {

       if (checkFunction(found[k])) {

         currentContext[currentContextIndex++] = found[k];

       }

     }

     continue;

   }

   tagName = token;

   var found = new Array;

   var foundCount = 0;

   for (var h = 0; h < currentContext.length; h++) {

     var elements = currentContext[h].getElementsByTagName(tagName);

     for (var j = 0; j < elements.length; j++) {

       found[foundCount++] = elements[j];

     }

   }

   currentContext = found;

 }

 return currentContext;

}



/*--------------------------------------------------------------------------------------------------------*/

/**

* update:

* 1. 針對前2個beta版,該版本修復了前兩個版本出現的 bug ,

* 2. 進行了代碼的簡單封裝(由於本人初學js,對js掌握的很淺,因此面向對象的理解很差,封裝的不好);

* 3. 增加了對 Ctrl 和 Shift 鍵的支持(目前shift鍵的功能和ctrl鍵的功能一樣,還不能達到仿windows的選區Shift鍵的功能)。

* 4. 增加了獲取“被選區選中元素”的方法,可以點擊按鈕“getRegions”看效果。

*/



function addEvent(eventType,eventFunc,eventObj){

   eventObj = eventObj || document;

   if(window.attachEvent)  eventObj.attachEvent("on"+eventType,eventFunc);

    if(window.addEventListener) eventObj.addEventListener(eventType,eventFunc,false);

 }

function clearEventBubble(evt){

  evt = evt || window.event;

   if (evt.stopPropagation) evt.stopPropagation(); else evt.cancelBubble = true;

    if (evt.preventDefault)  evt.preventDefault();  else evt.returnValue = false;

}


function posXY(event){

event = event || window.event;

var posX = event.pageX || (event.clientX +

        (document.documentElement.scrollLeft || document.body.scrollLeft));

var posY = event.pageY || (event.clientY +

        (document.documentElement.scrollTop || document.body.scrollTop));

return {x:posX, y:posY};

}


var _selectedRegions = [];

function RegionSelect(selRegionProp){

  this.regions =[];

  var _regions = document.getElementsBySelector(selRegionProp["region"]);

  if(_regions  &&  _regions.length > 0){

   var _self = this;

    for(var i=0; i< _regions.length;i++){

      _regions[i]. = function(){

        var evt = window.event || arguments[0];

        if(!evt.shiftKey  &&  !evt.ctrlKey){

         // 清空所有select樣式

         _self.clearSelections(_regions);

         this.className += " "+_self.selectedClass;

         // 清空selected數組,並加入當前select中的元素

         _selectedRegions = [];

         _selectedRegions.push(this);

        }else{

         if(this.className.indexOf(_self.selectedClass) == -1){

           this.className += " "+_self.selectedClass;

           _selectedRegions.push(this);

         }else{

           this.className = this.className.replaceAll(_self.selectedClass,"");

           _selectedRegions.remove(this);

         }

        }

        clearEventBubble(evt);

      }

      this.regions.push(_regions[i]);

    }

  }

  this.selectedClass = selRegionProp["selectedClass"];

  this.selectedRegion = [];

  this.selectDiv = null;

  this.startX = null;

  this.startY = null;

}


RegionSelect.prototype.select = function(){

 var _self = this;

 addEvent("mousedown",function(){

   var evt = window.event || arguments[0];

   _self.onBeforeSelect(evt);

   clearEventBubble(evt);

 },document);


 addEvent("mousemove",function(){

   var evt = window.event || arguments[0];

   _self.onSelect(evt);

   clearEventBubble(evt);

 },document);


 addEvent("mouseup",function(){

   _self.onEnd();

 },document);

}


RegionSelect.prototype.onBeforeSelect = function(evt){


 if(!document.getElementById("selContainer")){

    this.selectDiv = document.createElement("div");

    this.selectDiv.style.cssText = "position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;";

    this.selectDiv.id = "selContainer";

    document.body.appendChild(this.selectDiv);

  }else{

    this.selectDiv = document.getElementById("selContainer");

  }


  this.startX = posXY(evt).x;

  this.startY = posXY(evt).y;

  this.isSelect = true;


}


RegionSelect.prototype.onSelect = function(evt){

   var _self = this;

   if(_self.isSelect){

     if(_self.selectDiv.style.display == "none") _self.selectDiv.style.display = "";


     var posX = posXY(evt).x;

     var poxY = posXY(evt).y;


     _self.selectDiv.style.left   = Math.min(posX, this.startX);

    _self.selectDiv.style.top    = Math.min(poxY, this.startY);

    _self.selectDiv.style.width  = Math.abs(posX - this.startX);

    _self.selectDiv.style.height = Math.abs(poxY - this.startY);  


    var regionList = _self.regions;

    for(var i=0; i< regionList.length; i++){

      var r = regionList[i], sr = _self.innerRegion(_self.selectDiv,r);

      if(sr  &&  r.className.indexOf(_self.selectedClass) == -1){

         r.className = r.className + " "+_self.selectedClass;

         _selectedRegions.push(r);

      }else if(!sr  &&  r.className.indexOf(_self.selectedClass) != -1){

         r.className = r.className.replaceAll(_self.selectedClass,"");

        _selectedRegions.remove(r);

       }


    }

  }

}


RegionSelect.prototype.onEnd = function(){

 if(this.selectDiv){

   this.selectDiv.style.display = "none";

 }

 this.isSelect = false;

 //_selectedRegions = this.selectedRegion;

}


// 判斷一個區域是否在選擇區內

RegionSelect.prototype.innerRegion = function(selDiv, region){

  var s_top = parseInt(selDiv.style.top);

  var s_left = parseInt(selDiv.style.left);

  var s_right = s_left + parseInt(selDiv.offsetWidth);

  var s_bottom = s_top + parseInt(selDiv.offsetHeight);


  var r_top = parseInt(region.offsetTop);

  var r_left = parseInt(region.offsetLeft);

  var r_right = r_left + parseInt(region.offsetWidth);

  var r_bottom = r_top + parseInt(region.offsetHeight);


   var t = Math.max(s_top, r_top);

    var r = Math.min(s_right, r_right);

    var b = Math.min(s_bottom, r_bottom);

    var l = Math.max(s_left, r_left);


     if (b > t+5  &&  r > l+5) {

         return region;

     } else {

         return null;

     }


}


RegionSelect.prototype.clearSelections = function(regions){

 for(var i=0; i<regions.length;i++){

  regions[i].className = regions[i].className.replaceAll(this.selectedClass,"");

 }

}

//獲得所有選中的div對象

function getSelectedRegions(){

 return  _selectedRegions;

}


2、上面js中獲得到選擇的對象的處理方法

var arr = getSelectedRegions();

  for(var z=0; z<arr.length;z++){

      selInfo += arr[z].wid+",";//這裏的wid代表div的wid屬性,可以是其他的任何屬性

  }

3、在頁面最後加上

<script>

   new RegionSelect({

    region:'div.fileDiv',

    selectedClass: 'seled'

   }).select();

</script>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章