javascript实现鼠标选取拖动或Ctrl选取拖动
发布时间:2021-08-21 19:08:33
标签:javascript,鼠标
<style> *{position:absolute;} #panel *{border:1px solid gray} </style> <script> /**********判断浏览器**********/ var isIE = false; if(document.all) isIE = true; /*******HashArray*******/ function HashArray(){ this.keyList = new Array(); this.put = function(key, value){ this[key] = value; if(!this.containsKey(key)){ this.keyList.push(key); } } this.size = function(){ return this.keyList.length; } this.containsKey = function(key){ if(this.keyList.length == 0) return false; var keyStr = this.keyList.join(",") + ","; if(keyStr.indexOf(key + ",") == -1){ return false; }else{ return true; } } this.get = function(key){ return this[key]; } this.keySet = function(){ return this.keyList; } this.isEmpty = function(){ return this.keyList.length==0; } this.remove = function(key){ if(this.containsKey(key)){ delete this[key]; this.keyList.splice(this.getIndex(key), 1); } } this.removeAll = function(key){ for(var i=0;i<this.keyList.length;i++){ delete this[this.keyList[i]]; } this.keyList.length = 0; } this.getIndex = function(key){ for(var i=0;i<this.keyList.length;i++){ if(this.keyList[i] == key) return i; } } this.toString = function(){ var str = ""; for(var i=0;i<this.keyList.length;i++){ str+= this.keyList[i] + ":" + this[this.keyList[i]].toString() + ","; } return str; } } var dragArray = new HashArray(); /*********选中边框变色********/ function selecting(obj){ if(obj.selected) obj.style.borderColor = "lime"; else obj.style.borderColor = "gray"; } /*******拖动封装类********/ function DragObject(obj){ this.oldX = 0; this.oldY = 0; this.isDraging = false; this.dragObj = obj; this.dragObj.style.position="absolute"; if(!this.dragObj.style.left) this.dragObj.style.left = 0; if(!this.dragObj.style.top) this.dragObj.style.top = 0; var theObj = this; this.zIndex = 2; obj.onmousedown = function(){ theObj.startDrag(); } obj.onmousemove = function(){ theObj.drag(); } obj.onmouseup = function(){ theObj.endDrag(); } this.startDrag = function(){//alert(3) DragObject.curObj = this; //当前被拖动对象 this.isDrag = true; this.oldX = event.x; this.oldY = event.y; this.dragObj.style.zIndex = this.zIndex++; } this.endDrag = function(){ this.isDrag = false; } this.drag = function(){ if(this.isDrag){ var x = window.event.x; var y = window.event.y; if(dragArray.containsKey(this.dragObj.id)){ for(var i=0;i<dragArray.keyList.length;i++){ var obj = dragArray[dragArray.keyList[i]]; obj.isOnDrag = true; obj.style.left = parseInt(obj.style.left.replace("px","")) + (x - this.oldX); obj.style.top = parseInt(obj.style.top.replace("px","")) + (y - this.oldY); } } this.oldX = x; this.oldY = y; } } } /*********拖动DIV********/ isMouseDown = false; var originX,originY; var isDrag = false; function moveDiv(e){ if(DragObject.curObj) DragObject.curObj.drag(); if(isMouseDown && !isDrag){ var x,y; if(document.all){ x = event.x; y = event.y; }else{ x = e.pageX; y = e.pageY; } divMove.style.display="block"; divMove.style.width = Math.abs(x-originX) + "px"; divMove.style.height = Math.abs(y-originY) + "px"; if(x > originX){ divMove.style.left = originX+ "px"; }else divMove.style.left = (x-2)+ "px"; if(y > originY){ divMove.style.top = originY+ "px"; }else divMove.style.top = (y-2)+ "px"; } } /**********处理mousedown事件********/ function mousedown(e){ if(isIE){ if(event.srcElement.id == "panel"){ originX=event.x; originY=event.y; isMouseDown=true; }else{ isDrag = true; } }else{ if(e.target.id == "panel"){ originX=e.pageX; originY=e.pageY; isMouseDown=true; }else{ isDrag = true; } } } /**********处理mouseup事件********/ function mouseup(e){ if(isIE){ if(event.srcElement.id == "divMove" || event.srcElement.id == "panel"){ selectObjects(); isMouseDown=false; divMove.style.display='none'; }else{ if(DragObject.curObj) DragObject.curObj.endDrag(); isDrag = false; } }else{ if(e.target.id == "divMove" || e.target.id == "panel"){ selectObjects(); isMouseDown=false; divMove.style.display='none'; }else{ if(DragObject.curObj) DragObject.curObj.endDrag(); isDrag = false; } } } /*********选中对象********/ function selectObjects(){ for(var i=0;i<elems.length;i++){ var objX = elems[i].offsetLeft + elems[i].offsetWidth/2; var objY = elems[i].offsetTop + elems[i].offsetWidth/2; if(objX > divMove.offsetLeft && objX < divMove.offsetLeft + parseInt(divMove.style.width) && objY > divMove.offsetTop && objY < divMove.offsetTop + parseInt(divMove.style.width)){ elems[i].selected = true; dragArray.put(elems[i].id, elems[i]); selecting(elems[i]); } } } /**********ID取对象********/ function $(){ if(document.getElementById){ return document.getElementById(arguments[0]); }else{ return eval(arguments[0]); } } </script> <body onselectstart="return false;"> <div id="divMove" style="z-index:9999;display:none;border:1px solid lime;background:transparent;font-size:0px"></div> <div id="panel" style="width:1024;height:768;background:#555555;left:0px;top:0px"> <input id="z" type="button" value="注 册" style="top:200px;left:200px;"> <div id="d" style="width:150px;height:50px;top:100px;left:150px;">中国是一个发展中国家</div> </div> <script> var divMove = $("divMove"); var elems = $("panel").children; document.onmousemove=moveDiv; document.onmousedown=mousedown; document.onmouseup=mouseup; for(var i=0;i<elems.length;i++){ with(elems[i]){ elems[i].dragObj = new DragObject(elems[i]); elems[i].selected = false; elems[i].isOnDrag = false; onclick = function(){ if(this.selected){ if(!this.isOnDrag){ this.selected = !selected; dragArray.remove(this.id); }else{ this.isOnDrag = false; } }else if(dragArray.isEmpty() || event.ctrlKey){ this.selected = !selected; dragArray.put(this.id, this); } selecting(this); } } } </script> </body>


猜你喜欢
- 如何让animate在显示图片的过程保持窗口的标题不变animate -title "My Image Sequence"
- go语言支持语法自己实现枚举类型我们都知道go语言没有原生的枚举类型,但是做业务开发有些时候没有枚举类型确实不方便前后端联调。我们可以通过g
- PyTorch基础入门三:PyTorch搭建多项式回归模型 1)理论简介对于一般的线性回归模型,由于该函数拟合出来的是一条直线,所
- 一. 通过 ConfigProto 设置多线程 (具体参数功能及描述见 tensorflow/core/protobuf/config.pr
- Mysql安装的时候可以有msi安装和zip解压缩两种安装方式。zip压缩包解压到目录,要使用它还需对它进行一定的配置。下面对Mysql压缩
- MySQL的MIN函数是用来找出一个记录集最小值的记录。要了解MIN函数考虑的EMPLOYEE_TBL表具有以下记录:mysql> S
- 大家都知道,linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(
- FastApi快速构建一个web项目已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效
- 1、通过url下载即后端提供文件的地址,直接使用浏览器去下载通过window.location.href = 文件路径下载window.lo
- 本文实例讲述了python去除文件中空格、Tab及回车的方法。分享给大家供大家参考,具体如下:在最近的开发工作中,为了应付比赛赶进度,服务端
- 查询重写插件从MySQL 5.7.6开始,MySQL Server支持查询重写插件,可以在服务器执行之前检查并可能修改服务器接收的语句。以下
- 一,未使用 git add 缓存代码时。可以使用 git checkout -- filepathname (比如: git checkou
- 1.环境设置1.1gradio安装需要安装 gradio,安装办法就是 pip install gradio2.ffmpeg安装再次需要加入
- 一、背景:nginx 的log 不会自动按天备份,而且记录时间格式不统一,此程序专门解决这两个问题;二、windows 部署方式1.在 ng
- 目录现象根因分析getLastPacketReceivedTimeMs()方法调用时机解决方案现象应用升级MySQL驱动8.0后,在并发量较
- 首先,有个单例对象,它上面挂了很多静态工具方法。其中有一个是each,用来遍历数组或对象。var nativeForEach = [].fo
- ⭐️requests的使用(二)上一篇我们说了requests的简单用法,知道了如何发送请求,今天我们更深层次的来学习requests。我们
- 在Goland中,如果 import 了包,但在代码中没有使用,会自动帮你移除这个包的 引用有可能是习惯问题,每次写代码都习惯 先impor
- 任何东西只要跟Google有关就总能给我们带来点儿惊喜,2008年9月2日发布的Google Chrome浏览器也不例外。Google Ch
- 其实我之前已经有文章详细解释了页校验和:How to tell if the IO subsystem is causing corrupt