`
zhao103804
  • 浏览: 124611 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JavaScript模仿鼠标拖动选择功能

阅读更多
<html>
<head>鼠标点选功能</head>
 <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">
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;
}


/*--------------------------------------------------------------------------------------------------------*/
/**
 * author: 王永山
 * version: 1.1 beta
 * date: 2008-09-09
 * email: [email]wangys0927@163.com[/email]
 *
 * 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].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> 
 <body>
<button onclick="showSelDiv();">getRegions</button>
<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>
 </body> 
 <script>
    new RegionSelect({
     region:'div.fileDiv',
     selectedClass: 'seled'
    }).select();
 </script>
</html>

 網上收集整理

分享到:
评论

相关推荐

    仿Google的一个鼠标拖动效果

    本项目“仿Google的一个鼠标拖动效果”旨在通过Jquery这一强大的JavaScript库来模仿Google网站上的拖放功能,带给用户更加流畅、直观的操作体验。 Google在其众多产品和服务中广泛使用了拖放功能,例如Google日历、...

    JavaScript 仿 Dreamweaver 颜色选择器

    JavaScript 仿 Dreamweaver 颜色选择器是一种在网页中实现的颜色选取工具,它旨在模仿知名网页编辑软件Dreamweaver中的颜色选择功能。通过使用纯JavaScript编写,这个选择器可以方便地集成到任何HTML页面中,同时...

    jQuery鼠标拖动图片摇晃特效.zip

    总的来说,"jQuery鼠标拖动图片摇晃特效"是一个结合了JavaScript事件处理、CSS变换以及随机性技术的前端项目,展示了jQuery在实现动态网页效果方面的强大能力。对于想要学习或提升前端交互设计的开发者来说,这是一...

    模仿手机移动图标javascript

    总结来说,“模仿手机移动图标javascript”是一个结合了JavaScript、HTML和CSS技术的项目,通过拖放API实现了类似手机桌面的图标排序功能,让用户能够方便地重新组织和排序图标,而无需额外的操作。这个项目不仅锻炼...

    鼠标点击拖动选中(模仿google日历网格)

    本文将深入探讨“鼠标点击拖动选中”这一功能,它常见于许多应用,例如谷歌日历,使得用户能够方便地选择一个范围内的元素。我们将通过源码分析来理解这一功能的实现,并探讨其在实际开发中的应用。 首先,我们要...

    可拖动的Ajax精彩Vista窗口 JavaScript

    3. **可拖动功能**:在JavaScript中实现的可拖动窗口是指用户可以通过鼠标点击并移动来改变窗口位置的功能。这通常涉及到事件监听(如`mousedown`、`mousemove`和`mouseup`)、坐标计算以及DOM元素的位置更新。通过...

    模仿Laught桌面效果,可以进行拖动,滑动,滑屏,分页等功能

    实现拖动功能需要编程技术,如事件监听、坐标跟踪和对象状态更新。 **滑动**是移动设备和平板电脑上的常见交互方式,用户通过滑动手指来滚动内容或者在屏幕上移动元素。在Laught效果中,滑动可能用于浏览多项目列表...

    模仿google的首页 拖动设计面板

    【压缩包子文件名称列表】:“模仿google的拖动页面”可能包含了一个实现了拖放功能的网页示例,用户可以通过查看源代码了解如何在HTML、CSS和JavaScript中实现这种效果。“google首页”可能包含的是原始的谷歌首页...

    jQuery 实现的课拖拽层效果(模仿QQ空间的模块拖动功能).zip

    在本项目中,我们主要探讨的是如何利用jQuery库来实现一个类似于QQ空间模块拖动功能的交互效果。QQ空间的模块拖动功能允许用户自定义页面布局,将各种模块(如相册、日志、音乐等)自由地拖放到他们喜欢的位置。这种...

    jQuery模仿谷歌可放大缩小拖动的地图代码

    shiftzoom.js中的代码会监听DOM事件,比如滚轮滚动和鼠标拖动,从而执行相应的缩放和平移操作。geodata.js则负责解析和呈现地理数据,可能包括在地图上添加标记、绘制路线等。同时,cvi_tip_lib.js可能会提供高级的...

    JavaScript精彩网页特效实例精粹

    6. **拖放功能(Drag and Drop)**:允许用户通过鼠标拖动元素到指定位置,常用于文件上传或布局调整。JavaScript的拖放API提供了强大的支持,相关知识点包括事件监听、数据传输和DOM操作。 7. **计时器和倒计时...

    仿google自定义拖拽布局(jQuery)

    这种布局技术允许用户通过鼠标拖动来调整元素的位置,从而实现高度互动和个性化的界面设计。 首先,我们要理解“拖拽”(Drag and Drop)功能的基本原理。在JavaScript中,拖拽通常涉及到`mousedown`、`mousemove`...

    javascript脚本

    在JavaScript中,可以使用`mousedown`、`mousemove`和`mouseup`事件来实现元素的拖放功能。通过改变元素的CSS `left`和`top`属性,我们可以创建一个可以在三维空间中移动的图层。同时,利用CSS3的`transform`属性...

    超强JavaScript效果[超强JavaScript效果]

    2. **鼠标悬停提示**:类似于163登录后的提示效果,这通常通过`title`属性或自定义JavaScript事件实现,当鼠标悬停在元素上时显示额外信息。 3. **文字省略号显示**:当文本内容超过指定宽度时,使用CSS的`text-...

    javascript特效10例

    6. **拖放功能**:允许用户通过鼠标拖动元素进行排序或移动,这种功能在列表管理或文件上传场景中非常实用。 7. **时间轴动画**:JavaScript可以创建动态的时间轴,展示事件的发展过程,增加视觉吸引力。 8. **...

    仿Igoogle拖动DIV

    这个功能的核心在于利用JavaScript事件处理和DOM操作,让网页中的div元素能够响应用户的鼠标拖动操作,并在页面上自由移动。 首先,我们需要理解JavaScript中的事件处理机制。在这个项目中,主要涉及到的事件有`...

    完整版模拟鼠标移动.rar

    - 鼠标速度:模拟鼠标移动时可以设置移动的速度,以模仿真实的用户行为。 - 鼠标按钮状态:模拟点击时要考虑左键、右键或滚轮的状态。 5. **安全与合法性** 在使用模拟鼠标移动技术时,必须注意不要侵犯用户隐私...

    模仿MSN弹出对话框.rar

    对于拖动功能,需要监听鼠标事件,计算鼠标移动的距离,并相应更新对话框的位置。 7. **兼容性和性能优化**:考虑到不同的浏览器可能对某些特性支持不同,需要使用polyfill或条件语句确保代码在各浏览器上的兼容性...

    JavaScript版蜘蛛纸牌

    JavaScript版蜘蛛纸牌是一款完全基于JavaScript编程语言实现的在线游戏,它模仿了Windows操作系统中经典的蜘蛛纸牌游戏。这款游戏的开发耗时三周,旨在提供与原版游戏类似的体验,让玩家可以在网页环境中享受蜘蛛...

Global site tag (gtag.js) - Google Analytics