入力ボックス間の矢印キーの移動を許可する JavaScript / JQuery コードに取り組んでいます (はい、これが標準の UI を壊していることは承知しています)。
各要素をループし、各方向 (左、右、上、下) で最も近いものを見つけることによって機能します。
例
P1:(0, 0)、P2:(1, 0)、P3:(0, 2)
P1 には、右に 1 つの点 (P2) と上に 1 つの点 (P3) があります。
P2 には、左に 1 つの点 (P1) と上に 1 つの点 (P3) があります。
画像なし
P3 には 2 つのポイント (P1 と P2) がありますが、P1 の方が近いです。
したがって、最終的な動きは次のとおりです。
Up
1 -> 3
2 -> 3
Right
1 -> 2
Down
3 -> 1
Left
2 -> 1
この例では:
P1 には 2 つの着信接続と 2 つの発信接続があります。
P2 には、1 つの着信接続と 2 つの発信接続があります。
P3 には、2 つの着信接続と 1 つの発信接続があります。
これは私に考えさせました。
1 つ以上のポイントにアクセスできない (着信接続が 0) ようなポイントのセットはありますか? または、そのようなセットが存在しないことを証明できますか?
補足:
上下のコンポーネントを無視する場合 (垂直分割で左右のみを使用)、P1: (0, 0)、P2: (2, 0)、P3: (1, 4) でアクセスできない P3 をポイントします。 )。
誰にでも役立つ場合は、JavaScript / JQuery コードを次に示します。
function arrowKeyNavigation(elements) {
// Get the position of each element.
var elementOffsets = [];
elements.each(function(key, element) {
elementOffsets[key] = $(element).offset();
});
// Find the closest point in each direction and store the points in data('keyNav') for later use.
for (var i = 0; i < elementOffsets.length; i++) {
var closestPoints = [];
for (var j = 0; j < elementOffsets.length; j++) {
if (i != j) {
var distance = calcDistanceSquared(elementOffsets[i], elementOffsets[j]);
var quadrant = calcQuadrant(elementOffsets[i], elementOffsets[j]);
if (closestPoints[quadrant] == undefined || calcDistanceSquared(elementOffsets[i], elementOffsets[closestPoints[quadrant]]) > distance) {
closestPoints[quadrant] = j;
}
}
}
var closestElements = [];
for (var j = 0; j < closestPoints.length; j++) {
closestElements[j] = elements[closestPoints[j]];
}
$(elements[i]).data('keyNav', closestElements);
}
}
// Returns the distance between two points squared.
function calcDistanceSquared(offset1, offset2) {
...
}
// Returns 0, 1, 2 or 3 for left, up, right and down respectively.
// If a point is EXACTLY 45 degrees it will be classified as either left / right.
function calcQuadrant(offset1, offset2) {
...
}