var selList = []; window.onload = function() { //定义鼠标框选的区域 var canvas = document.getElementById('teminal-area'); var selDiv; var isSelect = false; var evt; //鼠标点击时候的坐标 var startX; var startY; //鼠标移动时的坐标 var _x = null; var _y = null; //区域内按下鼠标 canvas.onmousedown = function(e) { evt = window.event || arguments[0]; var parents = $(e.target).parents(); var flag = true; //需要加上横滚动条与最左边的距离 startX = (evt.clientX + $(document).scrollLeft() || evt.x); //设置范围 var minOffset = $("#teminal-area").width() + 200 - 20; //如果在范围之外,设置flag为false if (startX > minOffset) { flag = false; } if (flag) { //所有需要被选择的图标 var fileNodes = document.getElementsByClassName("device-content"); selList = []; for (var i = 0; i < fileNodes.length; i++) { if (fileNodes[i].className.indexOf("device-content") != -1) { if (fileNodes[i].className.indexOf("seled") != -1) { var len = fileNodes[i].className.length; fileNodes[i].className = fileNodes[i].className .substring(0, len - 6); } $(fileNodes[i]).find("span").removeClass("selected-mt"); selList.push(fileNodes[i]); } } // 左击 if (e.button == 0) { isSelect = true; startX = (evt.clientX + $(document).scrollLeft() || evt.x); startY = (evt.clientY + $(document).scrollTop() || evt.y); //虚线框 selDiv = document.createElement("div"); selDiv.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;"; selDiv.id = "selectDiv"; document.body.appendChild(selDiv); selDiv.style.left = startX + "px"; selDiv.style.top = startY + "px"; } else if (e.button == 2) { // 右击 $( $(this).siblings().children(".device-content") .children("span")).removeClass("selected-mt"); } } } clearEventBubble(evt); //区域内移动鼠标 canvas.onmousemove = function(e) { evt = window.event || arguments[0]; clearEventBubble(evt); if (isSelect) { if (selDiv.style.display == "none") { selDiv.style.display = ""; } //鼠标当前所在的x、y坐标,分别加上滚动条距离最左边与顶端的距离 _x = (evt.clientX + $(document).scrollLeft() || evt.x); _y = (evt.clientY + $(document).scrollTop() || evt.y); //框选区域,一个框有4个点,总是选取左上角的点 selDiv.style.left = Math.min(_x, startX) + "px"; selDiv.style.top = Math.min(_y, startY) + "px"; selDiv.style.width = Math.abs(_x - startX) + "px"; selDiv.style.height = Math.abs(_y - startY) + "px"; // ---------------- 关键算法 --------------------- var teminalTop = $("#teminal-area").scrollTop(); var _l = selDiv.offsetLeft - 200, _t = selDiv.offsetTop - 135 + teminalTop; var _w = selDiv.offsetWidth, _h = selDiv.offsetHeight; for (var i = 0; i < selList.length; i++) { var sl = selList[i].offsetWidth + selList[i].offsetLeft; var st = selList[i].offsetHeight + selList[i].offsetTop; if (sl > _l && st > _t && selList[i].offsetLeft < _l + _w && selList[i].offsetTop < _t + _h) { if (selList[i].className.indexOf("seled") == -1) { selList[i].className = selList[i].className + " seled"; $(selList[i]).find("span").addClass("selected-mt"); } } else { if (selList[i].className.indexOf("seled") != -1) { var len = selList[i].className.length; selList[i].className = selList[i].className.substring( 0, len - 6); $(selList[i]).find("span").removeClass("selected-mt"); } } } } clearEventBubble(evt); } //页面内松开鼠标(这个需要用document,而不是canvas,因为鼠标松开的时候也可能不在区域内) document.onmouseup = function(e) { isSelect = false; if (selDiv) { document.body.removeChild(selDiv); } _x = null, _y = null, selDiv = null, startX = null, startY = null, evt = null; canvas.onmousewheel = function(){ return true; } } }; //清除事件 function clearEventBubble(evt) { var evt = window.event || arguments[0]; if (evt.stopPropagation != null && evt.stopPropagation != undefined) evt.stopPropagation(); else evt.cancelBubble = true; if (evt.preventDefault) evt.preventDefault(); else evt.returnValue = false; }