Javascript 查找与单击最近的链接元素
我正在做一个我在网上发现的小js谜题,其中说明要编写一些js来查找鼠标点击事件的最近链接。我在这方面有一个良好的开端,但我想知道社区能否帮助我找到改进的方法 我的基本方法是循环遍历所有链接,计算出它们与mouseclick事件的距离,然后将其存储到下一次迭代或所有元素都已用尽,在这种情况下,我将返回最近的元素 我希望得到以下方面的反馈:Javascript 查找与单击最近的链接元素,javascript,oop,nearest-neighbor,Javascript,Oop,Nearest Neighbor,我正在做一个我在网上发现的小js谜题,其中说明要编写一些js来查找鼠标点击事件的最近链接。我在这方面有一个良好的开端,但我想知道社区能否帮助我找到改进的方法 我的基本方法是循环遍历所有链接,计算出它们与mouseclick事件的距离,然后将其存储到下一次迭代或所有元素都已用尽,在这种情况下,我将返回最近的元素 我希望得到以下方面的反馈: 我的算法准确吗?陷阱是什么 有没有更快更好的方法来确定最近的链接 我能想到的一个问题是,我基本上是使用链接元素的左上角点来确定距离,但是如果单击实际上是在链
- 我的算法准确吗?陷阱是什么
- 有没有更快更好的方法来确定最近的链接
<body>
<p><a href="" id="1">link 1</a></p>
<p><a href="" id="2">link 2</a></p>
<script>
window.FindNearestElementToBodyClick = {
init: function() {
document.addEventListener("click", this.findElementClosestToClick, true);
},
findElementClosestToClick: function(e) {
var x = e.x;
y = e.y;
var elems = document.body.getElementsByTagName("a"),
closestElem = {};
for(var i = 0; i < elems.length; i++) {
var eX = elems[i].offsetLeft,
eY = elems[i].offsetTop;
var diff = Math.sqrt((Math.abs(eX - x)*2) + (Math.abs(eY-y)*2));
if(closestElem.e == undefined) {
closestElem.e = {e: elems[i], diff: diff};
}
if( diff < closestElem.diff )
closestElem.e = {e: elems[i], diff: diff};
}
console.log(closestElem);
}
}
FindNearestElementToBodyClick.init();
</script>
</body>
window.FindNearestElementToBodyClick={
init:function(){
document.addEventListener(“单击”,this.findElementClosestToClick,true);
},
findElementClosestToClick:函数(e){
var x=e.x;
y=e.y;
var elems=document.body.getElementsByTagName(“a”),
closestElem={};
对于(变量i=0;i
我想您必须决定您希望性能最佳的位置-onload还是onclick。除非锚定要四处移动,否则您可能需要在前面做一些工作,即使只是设置页面中所有锚定及其位置的集合。这样,dom就不必在用户每次单击某个地方时都关闭并找出答案
理论上,每个锚点在页面中都有一个区域,其中任何单击都离它最近(如果有意义的话),并且这些区域是静态的(假设锚点不移动*)。您可以在加载时计算出这些区域,然后每次单击都可以直接映射到正确的锚点
但这可能不值得付出额外的努力。对我来说,你所拥有的似乎相当合理——除非有无数的锚和/或硬件很糟糕(可能是移动的,但你确实说过点击)
*流畅的布局/动态内容等将使该假设无效。您可以查看调整大小事件,并在移动对象时更新区域/集合。您可以首先使用`来确定它是否发生在链接内部(当然,我认为您必须向上遍历它的父对象,以确保您没有单击
中的嵌套元素)这取决于您想要定义为“最近的”:最近的角?最近的中心在哪里?最近的左上角(如代码中所示)?除此之外,我建议使用一个中心(offsetTop+offsetHeight/2
,类似于x-coord),而不是一个角落,角落行为会违背我作为用户的期望。请注意,您不需要运行document.body.getElementsByTagName(“a”)
每次函数调用时;这是一个活动节点列表,因此在添加或删除新的
的任何时间点,节点列表都是准确的。只是一个小小的进步