アクセシビリティ要件に対応するために、モーダルウィンドウスクリプトを作成しようとしています。要件は、ウィンドウからタブで離れると、ウィンドウを閉じる必要があることを示しています。また、ウィンドウを閉じると、元のトリガー要素がフォーカスを取り戻す必要があることも示しています。
いくつか掘り下げた後、私はこれを見つけました:親が「フォーカス」を失ったかどうかを判断するjQuery。ウィンドウから離れた場所にタブで移動したことを確認する最も簡単な方法は、focusinイベントを追跡することであり、開いているモーダルの子ではない要素にフォーカスが発生した場合は、ウィンドウを閉じます。ただし、この方法には問題があります(私の好みには少し重すぎることは言うまでもありません)。これを処理するコードは次のとおりです。
$('body').focusin(function(e) {
if (!$(e.target).parent().is('.current-window')) {
closeModal();
}
});
およびウィンドウを閉じる関数:
function closeModal() {
$('.modal-mask, .current-window').fadeOut('fast', function(){
$(this).removeClass('current-window');
$('.modal-mask').removeAttr('style');
$('.modal-trigger').focus();
});
}
明らかに、このコードを実行すると、closeModal()はfocusinイベント間で最大呼び出しスタックまで前後に起動するため、トリガー要素にフォーカスを与える前に「最大呼び出しスタックを超えました」というエラーメッセージをスローします。
完全なコードについては、このフィドルを参照してください:http: //jsfiddle.net/pbredenberg/wxX4T/
私はこの要件を処理するためのより良い方法を考えようとしています。少なくとも、無限ループを避けようとしています。誰かが私を正しい方向に向けることができますか?