前端——框选技术的实现

本文涉及的产品
文档翻译,文档翻译 1千页
文本翻译,文本翻译 100万字符
语种识别,语种识别 100万字符
简介: 前端——框选技术的实现
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;
}
相关文章
|
8天前
|
前端开发 JavaScript 持续交付
前端技术趋势:2024年值得关注的几个方面
【10月更文挑战第9天】前端技术趋势:2024年值得关注的几个方面
|
18天前
|
前端开发 JavaScript API
前端技术探索:从基础到未来趋势的深度剖析
前端技术探索:从基础到未来趋势的深度剖析
46 1
|
18天前
|
Rust 前端开发 JavaScript
前端技术新探索:从React到WebAssembly的高效之路
前端技术新探索:从React到WebAssembly的高效之路
51 1
|
10天前
|
存储 前端开发 JavaScript
前端技术趋势:在动态变化中寻求稳定
【10月更文挑战第7天】前端技术趋势:在动态变化中寻求稳定
25 0
|
10天前
|
前端开发 数据可视化 JavaScript
现代前端开发:掌握关键技术与趋势
【10月更文挑战第7天】现代前端开发:掌握关键技术与趋势
30 0
|
1天前
|
前端开发 JavaScript 安全
JavaScript前端开发技术
JavaScript(简称JS)是一种广泛使用的脚本语言,特别在前端开发领域,它几乎成为了网页开发的标配。从简单的表单验证到复杂的单页应用(SPA),JavaScript都扮演着不可或缺的角色。
10 3
|
2天前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
8天前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
11天前
|
存储 缓存 监控
|
13天前
|
前端开发 JavaScript API
前端技术新趋势:PWA与Jamstack的融合探索
【10月更文挑战第4天】前端技术新趋势:PWA与Jamstack的融合探索
24 4