TL;DR;
を強制的にfocus
Web ページのモーダル ボックス内に配置する方法はありますか?
ここに問題があります。テキスト、リンク、およびフォームを含む従来の Web ページがあります。ページ内の特定のリンクをクリックすると、モーダル ボックスが表示されます (fancybox
またはのようなものjQuery.ui.dialog
)。このモーダルには、リンクとフォーム要素も含まれています。ユーザーがその"tab"
キーを使用すると、モーダルの内側にある要素だけでなく、モーダルの外側にある要素も含め、ページ上のすべての要素にフォーカスできます。モーダルボックス内で強制的にフォーカスしたいのですが、それを行う方法が見つかりません。可能であれば、CSS または JavaScript でこれを行いたいと考えています。
jQuery.ui.dialog
オプションを使用して実行できるため、これが可能であることはわかっています。 http://jsfiddle.net/pomeh/QjLJk/1/show/modal
の例を次に示します。ソースコードを見ようとしましたが、正確にどのように機能するかわかりません。この問題を解決するように聞こえるjQuery UIソースコードで見つけたコードを次に示します。
this.document.bind( "focusin.dialog", function( event ) {
if ( !that._allowInteraction( event ) ) {
event.preventDefault();
$(".ui-dialog:visible:last .ui-dialog-content")
.data( widgetFullName )._focusTabbable();
}
});
_allowInteraction: function( event ) {
if ( $( event.target ).closest(".ui-dialog").length ) {
return true;
}
// TODO: Remove hack when datepicker implements
// the .ui-front logic (#8989)
return !!$( event.target ).closest(".ui-datepicker").length;
},
_focusTabbable: function() {
// Set focus to the first match:
// 1. First element inside the dialog matching [autofocus]
// 2. Tabbable element inside the content element
// 3. Tabbable element inside the buttonpane
// 4. The close button
// 5. The dialog itself
var hasFocus = this.element.find("[autofocus]");
if ( !hasFocus.length ) {
hasFocus = this.element.find(":tabbable");
}
if ( !hasFocus.length ) {
hasFocus = this.uiDialogButtonPane.find(":tabbable");
}
if ( !hasFocus.length ) {
hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
}
if ( !hasFocus.length ) {
hasFocus = this.uiDialog;
}
hasFocus.eq( 0 ).focus();
}
keydown: function( event ) {
if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE ) {
event.preventDefault();
this.close( event );
return;
}
// prevent tabbing out of dialogs
if ( event.keyCode !== $.ui.keyCode.TAB ) {
return;
}
var tabbables = this.uiDialog.find(":tabbable"),
first = tabbables.filter(":first"),
last = tabbables.filter(":last");
if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
first.focus( 1 );
event.preventDefault();
} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
last.focus( 1 );
event.preventDefault();
}
}