当前位置: 首页 > news >正文

javaScript——DOM续(五)

拖拽

🧲 问题描述

在网页中拖拽(drag)某些元素或文本时,如果没有正确阻止默认行为,浏览器可能会将拖动的内容带入搜索引擎或新标签页中,导致拖拽功能异常或页面跳转。

✅ 通用解决方案(现代浏览器)

在 onmousedown 事件中,阻止默认行为即可:

element.onmousedown = function(e) {e.preventDefault(); // 推荐使用现代方式// 或者传统方式:return false;
};

✅ e.preventDefault() 是推荐写法,兼容性更好。

⚠️ 问题出现在 IE8 及以下

在 IE8 及更早版本中:
• return false 有时无法阻止默认行为
• 鼠标事件的 preventDefault() 方法不被支持
• 拖拽时页面可能会直接跳转或选中内容

💡 IE8 的兼容方案:使用 setCapture()

element.onmousedown = function(e) {if (element.setCapture) {element.setCapture(); // IE 专有方法,锁定鼠标焦点}return false; // 仍然加上,增强兼容性
};

setCapture() 是做什么的?
• 让当前元素捕获所有鼠标事件(即使鼠标离开该元素也能接收事件)
• 常用于拖拽中保持元素对事件的控制
• IE 专属:仅 IE 支持 setCapture() 和 releaseCapture()

🚫 在现代浏览器(Chrome, Firefox 等)中无效,但不会报错

🚀 推荐跨浏览器写法(拖拽相关)

element.onmousedown = function(e) {e = e || window.event; // IE 兼容// 阻止默认行为if (e.preventDefault) {e.preventDefault();} else {e.returnValue = false; // IE8 及以下}// IE 专用鼠标捕获if (element.setCapture) {element.setCapture();}// 开始拖拽逻辑...
};

📌 小结

方法说明支持
e.preventDefault()阻止默认行为现代浏览器支持
return false传统方式,IE 有时不可靠所有浏览器,但不总是生效
setCapture()IE 专用方法,锁定鼠标事件接收仅 IE 支持
e.returnValue = falseIE 专用阻止默认行为仅 IE8 及以下

一个拖拽的效果

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style type="text/css">body {}.circle_one {width: 200px;height: 200px;border: 1px solid #efefef;background-color: red;position: absolute;}.circle_two {margin-top: 40px;width: 400px;height: 150px;border: 1px solid #efefef;background-color: yellow;/* position: absolute; */}</style></head><body><div class="circle_one" id="area"></div><div class="circle_two"></div></body><script type="text/javascript">let circleOne = document.getElementById('area')circleOne.onmousedown = () => {document.onmousemove = (e) => {console.log(e)e = e || window.event;let left = e.pageX;let top = e.pageY;circleOne.style.left = left + 'px';circleOne.style.top = top + 'px';}}circleOne.onmouseup = (e) => {document.onmousemove = null;}		</script>
</html>
http://www.xdnf.cn/news/245935.html

相关文章:

  • Vercel 全面指南:从零部署到高级实践
  • RAG技术完全指南(一):检索增强生成原理与LLM对比分析
  • Java反射机制终极指南:从基础到高级应用
  • 浅谈高校教育改革
  • C语言中数字转化为字符串的方法
  • 计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
  • 网络通信问题及解决方案
  • 【LeetCode Hot100】图论篇
  • Winform(7.序列化方式整理)
  • QML Image 组件详解
  • 课题推荐——通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景),使用无迹卡尔曼滤波(UKF)的非线性滤波算法,MATLAB实现
  • 数据结构之-----“交换排序”“归并排序”“计数排序”
  • JavaScript性能优化实战之资源加载与构建优化
  • 使用Set和Map解题思路
  • 奥地利学派方法论的三个基础
  • Java 算法入门:从基础概念到实战示例
  • 数字智慧方案6166丨智慧医养结合大数据平台方案(50页PPT)(文末有下载方式)
  • SpringBoot开发——SpringBoot3.4.3整合SpringThymeleaf、SpringSecurity搭建简易的管理后台,完成授权登录
  • 【设计模式】GoF设计模式之备忘录模式(Memento Pattern)
  • 文件操作--文件包含漏洞
  • 【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南
  • 【QNX+Android虚拟化方案】137 - msm-5.4 Kernel U盘 插入中断、枚举、匹配完整流程详解
  • 深度学习框架:PyTorch使用教程 !!
  • 缓存:缓解读库压力的高效方案与应用实践
  • DeepSeek V3 架构创新:大规模MoE与辅助损失移除
  • 本文不定期更新,用于收录各种怪异的python脚本
  • 实现Sentinel与Nacos的规则双向同步
  • Java朴实无华按天计划从入门到实战(94天直达Java高阶)
  • [计算机科学#7]:CPU的三阶段,取指令、解码、执行
  • 时序建模演进之路:从 MLP、RNN 到 LSTM 与 GRU