私はオンラインで見つけた小さなjsパズルに取り組んでおり、マウスクリックイベントへの最も近いリンクを見つけるためにいくつかのjsを書くように述べています。良いスタートを切れましたが、コミュニティがそれを改善する方法を見つけるのを手伝ってくれるかどうか疑問に思っていました.
私の基本的なアプローチは、基本的にすべてのリンクをループし、mouseclick イベントからの距離を把握し、次の反復まで、またはすべての要素が使い尽くされるまで保存することです。その場合、最も近い要素を返します。
次の点についてフィードバックをお願いします。
- 私のアルゴリズムは正確ですか?落とし穴は何ですか?
- 最も近いリンクを決定するためのより高速で優れたアプローチはありますか?
私が考えることができる 1 つの問題は、基本的にリンク要素の左上のポイントを使用して距離を決定していることですが、クリックが実際にリンク自体または要素の右下にあった場合はどうなるでしょうか? リンクは最も近い要素である必要がありますが、私の実装では、次のリンクがより近くにあり、誤った結果を引き起こす可能性があります。
<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>