我一直在研究 JavaScript / JQuery 代码,它允许在输入框之间移动箭头键(是的,我知道这会破坏标准 UI)。
它通过循环遍历每个元素并在每个方向(左、右、上和下)找到最接近的元素来工作。
例子
P1:(0, 0), P2:(1, 0), P3:(0, 2)
P1 有一个点向右 (P2) 和一个点向上 (P3)。
P2 向左一点 (P1) 和向上一点 (P3)。
禁止摄影
P3 有两个点向下(P1 和 P2),但 P1 更接近。
因此最终的动作是:
Up
1 -> 3
2 -> 3
Right
1 -> 2
Down
3 -> 1
Left
2 -> 1
对于此示例:
P1 有两个传入连接和两个传出连接。
P2 有一个传入连接和两个传出连接。
P3 有两个传入和一个传出连接。
这让我思考。
是否存在一组点,使得一个或多个点无法访问(0 个传入连接),或者可以证明不存在这样的集合?
旁注:
如果您忽略上/下组件(仅使用带有垂直拆分的左右),则在 P1 中不可访问的点 P3:(0, 0),P2:(2, 0),P3:(1, 4 )。
这是 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) {
...
}