Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找与单击最近的链接元素_Javascript_Oop_Nearest Neighbor - Fatal编程技术网

Javascript 查找与单击最近的链接元素

Javascript 查找与单击最近的链接元素,javascript,oop,nearest-neighbor,Javascript,Oop,Nearest Neighbor,我正在做一个我在网上发现的小js谜题,其中说明要编写一些js来查找鼠标点击事件的最近链接。我在这方面有一个良好的开端,但我想知道社区能否帮助我找到改进的方法 我的基本方法是循环遍历所有链接,计算出它们与mouseclick事件的距离,然后将其存储到下一次迭代或所有元素都已用尽,在这种情况下,我将返回最近的元素 我希望得到以下方面的反馈: 我的算法准确吗?陷阱是什么 有没有更快更好的方法来确定最近的链接 我能想到的一个问题是,我基本上是使用链接元素的左上角点来确定距离,但是如果单击实际上是在链

我正在做一个我在网上发现的小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”)
每次函数调用时;这是一个活动节点列表,因此在添加或删除新的
的任何时间点,节点列表都是准确的。只是一个小小的进步