JavaScript¼òµ¥ÊµÏÖÊó±êÍ϶¯Ñ¡Ôñ¹¦ÄÜ

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡<style><!--

¡¡¡¡body{padding-top:50px;padding-left:100px;padding-right:150px;}

¡¡¡¡.fileDiv{float:left;width:100px;height:100px;text-align:center;line-height:100px;font-size:12px;border:1px solid #cccccc;margin-right:10px;margin-bottom:10px;}

¡¡¡¡.seled{border:1px solid #ff0000;background-color:#D6DFF7;}

¡¡¡¡--></style>

¡¡¡¡<script type="text/javascript">// <![CDATA[

¡¡¡¡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;

¡¡¡¡}

¡¡¡¡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].onmousedown = 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,"");

¡¡¡¡}

¡¡¡¡}

¡¡¡¡function getSelectedRegions(){

¡¡¡¡return  _selectedRegions;

¡¡¡¡}

¡¡¡¡function showSelDiv(){

¡¡¡¡var selInfo = "";

¡¡¡¡var arr = getSelectedRegions();

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

¡¡¡¡selInfo += arr[i].innerHTML+"\n";

¡¡¡¡}

¡¡¡¡alert("¹²Ñ¡Ôñ "+arr.length+" ¸öÎļþ£¬·Ö±ðÊÇ£º\n"+selInfo);

¡¡¡¡}

¡¡¡¡// ]]></script>

¡¡¡¡<p><button onclick="showSelDiv();">getRegions</button></p>

¡¡¡¡<div class="fileDiv">file1</div>

¡¡¡¡<div class="fileDiv">file2</div>

¡¡¡¡<div class="fileDiv">file3</div>

¡¡¡¡<div class="fileDiv">file4</div>

¡¡¡¡<div class="fileDiv">file5</div>

¡¡¡¡<div class="fileDiv">file6</div>

¡¡¡¡<div class="fileDiv">file7</div>

¡¡¡¡<div class="fileDiv">file8</div>

¡¡¡¡<div style="float: left; width: 100%;"><button onclick="showSelDiv();">getRegions</button></div>

¡¡¡¡<script type="text/javascript">// <![CDATA[

¡¡¡¡new RegionSelect({

¡¡¡¡region:'div.fileDiv',

¡¡¡¡selectedClass: 'seled'

¡¡¡¡}).select();

¡¡¡¡// ]]></script>