By
被删
更新日期:
需要获取鼠标所在位置是否为某种特定元素,然后进行相关处理。本文介绍一种实现方法。
常用坐标相关属性
首先,获取鼠标坐标的兼容问题大家都很熟悉了。
此处粘贴一些常用坐标相关属性:
1 2 3 4 5 6 7 8 9 10 11 12 13
| scrollHeight scrollLeft scrollTop scrollWidth offsetHeight offsetLeft offsetTop event.clientX event.clientY event.offsetX event.offsetY document.documentElement.scrollTop 垂直方向滚动的值 event.clientX + document.documentElement.scrollTop
|
绑定鼠标事件
现在我们来获取鼠标位置
此处需对IE事件、FireFox事件等兼容
- 绑定方式有几种
- 1.在元素中,onXXX(事件)绑定
- 2.在Javascript代码中,获得元素并为元素的onXXX(事件)绑定
1 2 3 4 5
| if (document.addEventListener) { element.addEventListener(event, eventFunction); }else{ element.attachEvent(event, eventFunction); }
|
获取鼠标坐标
IE中可以直接使用 event对象,而 FF中则不可以
- 1.window.event || arguments.callee.caller.arguments[0]获取event对象
- 2.将 event 作为参数来传递, function xxx(e){var e = e || window.event;}
计算鼠标位置
1 2
| var eventX = e.pageX - scrollX || e.clientX ; var eventY = e.pageY - scrollY || e.clientY ;
|
获取当前位置是否有特定元素
- 给需要检测的元素绑定id或者自定义属性
- 通过不断获取当前元素父元素,直至获取成功(通过自定义属性判断)或者元素为body
1 2 3 4 5 6
| function fnGetTable(oEl) { while (null !== oEl && $(oEl).attr("自定义属性") !== "特定属性值" && target.tagName !== "BODY") { oEl = oEl.parentElement; } return oEl; }
|
实例:下拉菜单点击外围自动关闭
1 2 3 4 5
| if (document.addEventListener) { element.addEventListener(event, clickOutside); }else{ element.attachEvent(event, clickOutside); }
|
- clickOutside对象维护队列,该队列对象为id和callback事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| function clickOutside() { var list = {}; return function(id, cb) { list.id.push(id); list.cb[id] = cb; $(document).off("click").on("click", function(e) { var e = e || window.event, eventX = e.pageX - scrollX || e.clientX, eventY = e.pageY - scrollY || e.clientY, target = document.elementFromPoint(eventX, eventY), id = $(target).attr("id"); while (list.id.indexOf(id) == -1 && target.tagName != "BODY") { target = target.parentElement; id = $(target).attr("id"); } for (i in list.id) { if (list.id[i] != id) { list.cb[list.id[i]](); list.cb.splice(list.id[i], 1); list.id.splice(i, 1); } } if (!list.id.length) $(document).off("click"); }); }; }
|
结束语
解决办法很多,优化方法也很多,代码都是在一次又一次重构和提炼中变得出彩的呢。
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢