11

每当我在下面的“插入超链接”文本输入中键入内容时,所有单词都会textarea在其后面。确定和取消按钮工作正常,但我无法专注于文本输入。

我们正在使用 jQuery UI 1.10.1。它与以前版本的 jQuery 1.8.x 配合得很好。

在此处输入图像描述

我检查了 jQuery 背后的代码,它在打开模态对话框时调用了以下方法:

_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();
},

_keepFocus: function (event) {
    function checkFocus() {
        var activeElement = this.document[0].activeElement,
            isActive = this.uiDialog[0] === activeElement ||
                $.contains(this.uiDialog[0], activeElement);
        if (!isActive) {
            this._focusTabbable();
        }
    }
    event.preventDefault();
    checkFocus.call(this);
    // support: IE
    // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
    // so we check again later
    this._delay(checkFocus);
},

取自这里:http ://code.jquery.com/ui/1.10.1/jquery-ui.js

4

5 回答 5

10

我发现的第二个答案是,在以下代码中,jQuery 将文档绑定到对话框。因此,当我单击所需按钮的 onclick 事件(或您正在处理的任何事件)时取消绑定时:

 if (window.jQuery && window.jQuery.ui.dialog) {
   $(document).unbind("focusin.dialog");
 }

这是 jQuery UI 将它的_focusTabble()方法绑定到focusin.dialog文档事件的地方。

if ( !$.ui.dialog.overlayInstances ) {
            // Prevent use of anchors and inputs.
            // We use a delay in case the overlay is created from an
            // event that we're going to be cancelling. (#2804)
            this._delay(function() {
                // Handle .dialog().dialog("close") (#4065)
                if ( $.ui.dialog.overlayInstances ) {
                    this.document.bind( "focusin.dialog", function( event ) {
                        if ( !$( event.target ).closest(".ui-dialog").length &&
                                // TODO: Remove hack when datepicker implements
                                // the .ui-front logic (#8989)
                                !$( event.target ).closest(".ui-datepicker").length ) {
                            event.preventDefault();
                            $(".ui-dialog:visible:last .ui-dialog-content")
                                .data("ui-dialog")._focusTabbable();
                        }
                    });
                }
            });
        }
于 2013-03-28T15:27:47.070 回答
1

我为解决这个问题所做的就是注释掉这个$(".ui-dialog:visible:last .ui-dialog-content").data("ui-dialog")._focusTabbable();

您可以在下面找到完整的代码:

    if ( !$.ui.dialog.overlayInstances ) {
        // Prevent use of anchors and inputs.
        // We use a delay in case the overlay is created from an
        // event that we're going to be cancelling. (#2804)
        this._delay(function() {
            // Handle .dialog().dialog("close") (#4065)
            if ( $.ui.dialog.overlayInstances ) {
                this.document.bind( "focusin.dialog", function( event ) {
                    if ( !$( event.target ).closest(".ui-dialog").length &&
                            // TODO: Remove hack when datepicker implements
                            // the .ui-front logic (#8989)
                            !$( event.target ).closest(".ui-datepicker").length ) {
                        event.preventDefault();
                        //$(".ui-dialog:visible:last .ui-dialog-content")
                            //.data("ui-dialog")._focusTabbable();
                    }
                });
            }
        });
    }
于 2013-03-27T17:56:19.783 回答
1

另一种停止阻止来自 jquery 对话框的焦点的方法

$.widget("ui.dialog", $.ui.dialog, {
    _allowInteraction: function (event) {
        return !!$(event.target).closest(".input-container").length || this._super(event);
    }
});

.input-container包含应该获得焦点的控件的容器在哪里。

于 2019-08-02T14:40:50.467 回答
1

那是因为 jquery 阻止了对话框子之外的焦点,jquery 有这个你可以阅读的方法,它会将你想要允许焦点的其他元素列入白名单。

"_allowInteraction( event )Returns: Boolean Modal 对话框不允许用户与对话框后面的元素进行交互。这对于不是对话框子元素但绝对定位为看起来好像它们是的元素可能是有问题的。_allowInteraction( ) 方法确定是否应允许用户与给定的目标元素进行交互;因此,它可用于将不是对话框子元素但您希望用户能够使用的元素列入白名单。”

https://api.jqueryui.com/dialog/#method-_allowInteraction

因此,我要对具有类.other-popups的某些项目禁用此“块焦点”的方法是在代码中添加此行

$.widget( "ui.dialog", $.ui.dialog, {
    _allowInteraction: function( event ) {
        return !!$( event.target ).closest( ".other-popups" ).length || this._super( event );
    }
});

或完全禁用

 $.widget( "ui.dialog", $.ui.dialog, {
        _allowInteraction: function( event ) {
            return true ;
        }
    });
于 2020-01-06T11:14:05.637 回答
0

我有一个类似的问题,我需要将焦点放在我的对话框的内容中(对于 WCAG)。单独使用 focus() 失败了,所以我的最终解决方案是在我添加的对话框实例化中:

focus: function(event, ui) {
                    setTimeout(function(){ 
                        $('#element').blur().focus().css({'color': '#000', 'text-decoration' : 'none', 'cursor' : 'default'});
                    }, 500);
                }

我使用超时来确保兼容性。*注意,我将“#element”设置为锚标记(交互式元素),以便获得焦点。这就是造型的原因。

这段代码应该也可以添加到 jQuery 对话框的“打开”功能中。

于 2017-07-05T14:15:40.320 回答