我找不到任何可靠的解决方案,所以我选择编写自己的函数。虽然我不太乐意搞砸它,但我必须控制 TAB 键的行为并创建全局 keyup/keydown 函数。
对于那些感兴趣的人,我在 SO、here、here和here中找到了一些资源。
请注意,我为脚本中的锚分配了一个名为“已禁用”的 CSS 类,因此您可以考虑在我的代码中看到的那些,例如disabled="disabled"
适用元素的属性。此外,我无法找到一种方法将其从 html 内容集中到浏览器的可选 UI 元素中,但这可能是最后一个问题。
// lightbox keyboard navigation
function getFocusList() {
return $('body,#lightbox *:visible').filter(function(idx,elm) {
if ($(elm).is('body')) return true;
if (/^hidden$/i.test($(elm).css('visibility'))) return false;
return (
(/^a(rea)?$/i.test(elm.nodeName) && $(elm).hasAttr('href') && !$(elm).is('.disabled')) ||
(/^(input|textarea|button|select)$/i.test(elm.nodeName) && !$(elm).prop('disabled')) ||
(/^\d+$/.test($(elm).prop('tabindex')) && !$(elm).prop('disabled') && !$(elm).is('.disabled'))
)
});
}
function globalKeyDown(e) {
var
LB = !!$('#lightbox').length,
isTAB = e.which == 9,
isSHIFT = e.which == 16,
SHIFT_ON = LB && typeof $('#lightbox').data('SHIFT_ON') != 'undefined'
if (isSHIFT && LB) $('#lightbox').data('SHIFT_ON',true);
if (!isTAB || !LB) return;
var focusList = getFocusList(), nextIndex;
var curIndex = $.inArray($(this).get(0),focusList);
if (SHIFT_ON) nextIndex = --curIndex == 0 ? focusList.length - 1 : curIndex;
else nextIndex = ++curIndex == focusList.length ? (focusList.length > 1 ? 1 : 0) : curIndex;
var next = $(focusList[nextIndex]);
e.preventDefault();
e.stopImmediatePropagation();
next.focus();
}
function globalKeyUp(e) {
var
LB = !!$('#lightbox').length,
isSHIFT = e.which == 16,
SHIFT_ON = LB && typeof $('#lightbox').data('SHIFT_ON') != 'undefined'
if (isSHIFT && SHIFT_ON) $('#lightbox').removeData('SHIFT_ON')
}
$.fn.extend({
hasAttr:function(attrStr) {
var res = true;
$(this).each(function() {
if (typeof $(this).attr(attrStr) == 'undefined') res = false;
});
return res;
}
});
$(document).ready(function() {
$('body')
.on('focus','#lightbox a',function() {$(this).addClass('hover')})
.on('blur','#lightbox a',function() {$(this).removeClass('hover')})
.on('keydown','*',globalKeyDown).on('keyup','*',globalKeyUp)
.on('keydown',globalKeyDown).on('keyup',globalKeyUp)
// remaining jQuery code...
});
我希望这可以为其他有类似问题的人节省一些时间。