jQuery UI对话框按钮焦点

67
当使用jQuery UI对话框打开时,它会选择其中一个按钮并突出显示它或将焦点设置为它等等... 我该如何阻止这种行为,使对话框打开时没有任何按钮被突出显示? 编辑: 我在对话框选项中尝试了以下方法,但无法从按钮中移除焦点:
...
open:function(event, ui) { $("myunimportantdiv").focus(); },
...

注意:作为一种临时解决方案,我修改了.ui-state-focus的CSS样式,但这并不理想...


请参见http://dev.jqueryui.com/ticket/4731。将在1.9中添加一个选项以使其可配置。 - cope360
请参考https://dev59.com/lnM_5IYBdhLWcg3w2XBg,了解导致此问题的代码细节。 - cope360
查看我的解决方案,以防止跳转焦点到jQuery UI对话框。 - Roc
13个回答

74

使用 blur 方法。您可以尝试此示例。

<html>
    <head>
        <title>No Focus on jQuery Dialog</title>
        <link type="text/css" rel="stylesheet" href="ui.all.css" />
        <script type="text/javascript" src="jquery-1.3.2.min.js"></script>
        <script type="text/javascript" src="ui.core.js"></script>
        <script type="text/javascript" src="ui.dialog.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                // Dialog to confirm or cancel
                // Focuses on confirm by default.
                $('#noFocusDialog').dialog({
                    autoOpen: false,
                    buttons: {
                        Confirm: function() {
                            $(this).dialog('close');
                        },
                        Cancel: function() {
                            $(this).dialog('close');
                        }
                    }
                });

                // Trigger to open the dialog
                $('#openNoFocusDialog').click(function() {
                    $('#noFocusDialog').dialog('open');

                    // Remove focus on all buttons within the
                    // div with class ui-dialog
                    $('.ui-dialog :button').blur();
                });
            });
        </script>
    </head>
    <body>
        <a id="openNoFocusDialog" href="#">Open Dialog</a>
        <div id="noFocusDialog">
            <p>Confirm that no elements have focus</p>
        </div>
    </body>
</html>

20

谢谢您的回答,但是在我看来,最好的解决方案(至少对我而言,代码最少且不必在DOM上使用不必要的方法)是在对象数组中定义您的对话框按钮:

buttons: [{
            id  :   "button1",
            text    :   "Button1 text",
            title   :   "tooltip1text1",
            tabIndex:   -1,
            click   :   clickCallback 
        },{
            id      :   "button2",
            text    :   "Button2 text", 
            title   :   "tooltip1text2",
            tabIndex:   -1,
            click   :   function(){$(this).dialog("close")}
        }]

防止你的按钮获得焦点的重要部分是:tabIndex:-1

给你的按钮赋予id也是一种方便且易读的方法。


5
不是一个好主意。这样做会影响可访问性——它禁用了使用tab键来浏览用户界面的功能。 - Vroo
如果您担心可访问性(如@Vroo所提到的),则仅当存在一个按钮并且它关闭对话框时,此答案仍然有效。这样,用户可以使用Esc键来关闭它。只需确保将“closeOnEscape”属性保留为“true”。 - Mike

8

我也遇到了同样的问题...尝试将焦点设置到另一个元素并没有解决我的问题,但是在“open”回调函数中取消所选元素的焦点却起到了作用:

    $('#dialog').dialog
    ({
    open: function ()
        {
        $('#element-that-gets-selected').blur();
        }
    });

我想要防止焦点聚集在没有指定名称的情况下,可以使用类似于以下代码的选择器:

:first
    $('#dialog').dialog
    ({
    open: function ()
        {
        $(this).find('select, input, textarea').first().blur();
        }
    });

1
我实际上在“open:”选项的函数中使用了@Ed Saito的代码,它运行良好。就像这样: open: function() { $(".ui-dialog :button").blur(); } - JustinP8

7
buttons: [
    {
        tabIndex: -1,
        text: 'Yes',
        click: function(){
            DeleteStuff();
            $(this).dialog('close');
        }
    },
    {
        text: 'No',
        click: function(){
            // Don't delete
            $(this).dialog('close');
        }
    }
]

这是我找到的唯一解决方案。 tabIndex: -1是解决方法。 噢,我想聚焦于第二个按钮,所以默认情况下,“删除项目?”确认不会删除该项。

4

它明显的焦点导致jQuery Dialog打开时滚动到有趣的区域。现在几乎到处都在使用。

虽然模糊(blur)可以起作用,但如果内容很多就不行了。如果按钮在内容底部,模糊将删除选择,但仍将对话框滚动到底部。使用scrollTop将内容滚动到顶部,但保留选定的按钮。如果用户意外按下回车键,按钮或链接将被触发。我选择了一种组合方法:

$('#dialog').dialog({
    open: function (event, ui){

        $('a_selector').blur();
        $(this).scrollTop(0); 

    }
});

非常顺利地完成了...


3

只需添加此行代码即可删除自动对焦功能:

$.ui.dialog.prototype._focusTabbable = function(){};

你可以将它添加到一个共享的Javascript文件中,这样就可以防止所有对话框自动聚焦!不再需要在所有对话框中复制和粘贴。


成功了。而其他提出的3-4个解决方案失败了。 - Razvan_TK9692

1
我知道答案已经被选中,但是我在很久以前在这里找到了一个简单的HTML解决方案。
将以下代码添加为您指定为对话框的DIV的第一个元素。
<span class="ui-helper-hidden-accessible"><input type="text" /></span>

这有什么帮助?它提供了哪些辅助功能? - Agi Hammerthief

1

这是我通常做的事情,总是有效:

open: function() {
    $('.ui-dialog button').removeClass('ui-state-focus');
},

1
或者,只需在调用其他按钮之前创建一个虚拟输入即可。这样做的原因是UI只是寻找第一个“输入”作为默认值,通过欺骗UI先看到一个错误的输入,焦点被重定向。
<div id="dialog-confirm" title="Warning!">
<input type='text' size='0' style='position:relative;top:-500px;' />
<span class="ui-icon ui-icon-alert" style="float: left; margin: 0 0 0 0;"></span>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac 
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit
 amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi 
vitae est. Mauris placerat eleifend leo.</p>
</div>

1

嗯,这里的所有解决方案似乎都需要使用代码或者hack。所以我将发布我的解决方案,仅基于CSS覆盖。让我感到困扰的是轮廓使按钮看起来像是“已选中”,因此我只是用“none”来覆盖它:

.ui-dialog .ui-dialog-titlebar button.ui-button:focus,
.ui-dialog .ui-dialog-titlebar button.ui-button.ui-state-focus,
.ui-dialog .ui-dialog-titlebar button.ui-button.ui-state-active,
.ui-dialog .ui-dialog-titlebar button.ui-button.ui-state-hover  {
    outline:none;
}

你也可以添加/覆盖其他任何让你不舒服的样式 :)

这是本页面唯一对我有效的答案。修改JS没有任何作用。谢谢! - ViaTech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接