阻止jQuery UI对话框将焦点设置为第一个文本框

slo*_*ife 154 javascript jquery jquery-ui

我已经设置了一个jQuery UI模式对话框,以便在用户单击链接时显示.在该对话框div标签中有两个文本框(我只为简洁显示1的代码),它被更改为对焦点做出反应的jQuery UI DatePicker文本框.

问题是jQuery UI对话框('open')以某种方式触发第一个文本框具有焦点,然后触发datepicker日历立即打开.

所以我正在寻找一种方法来防止焦点自动发生.

<div><a id="lnkAddReservation" href="#">Add reservation</a></div>

<div id="divNewReservation" style="display:none" title="Add reservation">
    <table>
        <tr>
            <th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
            <td>
                <asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
            </td>
        </tr>
    </table>

    <div>
        <asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
    </div>
</div>

<script type="text/javascript">
    $(document).ready(function() {
        var dlg = $('#divNewReservation');
        $('.datepicker').datepicker({ duration: '' });
        dlg.dialog({ autoOpen:false, modal: true, width:400 });
        $('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
        dlg.parent().appendTo(jQuery("form:first"));
    });
</script>
Run Code Online (Sandbox Code Playgroud)

slo*_*ife 76

jQuery UI 1.10.0 Changelog故障单4731列为已修复.

看起来没有实现focusSelector,而是使用了对各种元素的级联搜索.从机票:

扩展自动对焦,从[autofocus]开始,然后:tabbable内容,然后是buttonpane,然后是关闭按钮,然后是对话框

因此,使用autofocus属性标记元素,这是应该获得焦点的元素:

<input autofocus>
Run Code Online (Sandbox Code Playgroud)

文档中,解释了焦点逻辑(仅在目录下,标题为'Focus'):

打开对话框后,焦点会自动移动到与以下内容匹配的第一个项目:

  1. 具有该autofocus属性的对话框中的第一个元素
  2. :tabbable对话框内容中的第一个元素
  3. :tabbable对话框按钮窗格中的第一个元素
  4. 对话框的关闭按钮
  5. 对话框本身

  • 将焦点设置为屏幕外的任何元素将窗口向上或向下滚动到该元素,只要窗口获得焦点,就会发生这种情况,而不仅仅是打开对话框.如果我使用Firebug来"检查元素",然后在文档窗口中单击,我的窗口会向上或向下滚动到jQuery-UI所关注的任何元素.问题不在于如何选择哪个元素获得焦点,而是如何*防止*焦点.选择要关注的不同元素并不能解决问题. (3认同)
  • jQuery UI认为这种"固定"的想法很疯狂.解决方法是完全删除*any*自动对焦逻辑.我请你打开一个对话框,而不是专注于输入.很烦人. (3认同)
  • 老实说,我不记得了. (2认同)
  • fwiw,我在第一个输入上方添加了一个输入w/type ="hidden",并为其添加了autofocus属性.它并不意味着你认为它意味着什么,但它可以解决这个问题. (2认同)

Pat*_*ott 75

在它上面添加一个隐藏的跨度,使用ui-helper-hidden-accessible使其通过绝对定位隐藏.我知道你有这个类,因为你正在使用来自jquery-ui的对话框,它在jquery-ui中.

<span class="ui-helper-hidden-accessible"><input type="text"/></span>
Run Code Online (Sandbox Code Playgroud)

  • 这会给使用辅助技术的人带来麻烦(例如屏幕阅读器) (3认同)

Fab*_*tté 61

在jQuery UI> = 1.10.2中,您可以_focusTabbable使用安慰剂函数替换原型方法:

$.ui.dialog.prototype._focusTabbable = $.noop;
Run Code Online (Sandbox Code Playgroud)

小提琴

这将影响dialog页面中的所有内容,而无需手动编辑每个页面.

原始函数除了将焦点设置为具有autofocusattribute/tabbableelement/的第一个元素或者回退到对话框本身之外什么都不做.因为它的用途只是设置一个元素,所以应该没有问题替换它noop.

  • 小时,小时,小时和小时燃烧.我的客户谢谢你. (7认同)

小智 28

我找到了以下代码,jQuery UI对话框函数用于打开.

c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();
Run Code Online (Sandbox Code Playgroud)

您可以解决jQuery行为或更改行为.

tabindex -1用作解决方法.

  • @slolife - 抱歉复活这个非常老的线程,但是该票据说修复(`focusSelector`选项)应该是在jQueryUI 1.8中,我们现在是1.8.13而我没有看到它[jQueryUI dialog docs](http://jqueryui.com/demos/dialog/).这发生了什么事? (3认同)
  • 谢谢你的研究.现在我知道这是实际的代码.我可能会向jQuery UI团队提出建议,添加一个禁用此自动对焦的选项. (2认同)

sil*_*ire 26

从jQuery UI 1.10.0开始,您可以使用HTML5属性 自动聚焦选择要关注的输入元素.

您所要做的就是在对话框中创建一个虚拟元素作为第一个输入.它将为您吸收焦点.

<input type="hidden" autofocus="autofocus" />
Run Code Online (Sandbox Code Playgroud)

这已在2013年2月7日在Chrome,Firefox和Internet Explorer(所有最新版本)中进行了测试.

http://jqueryui.com/upgrade-guide/1.10/#added-ability-to-specify-which-element-to-focus-on-open

  • 这仅在输入未隐藏时有效.:-( (6认同)

Rob*_*van 14

在玩的时候想出这个.

我发现使用这些解决方案来移除焦点,导致ESC键在第一次进入Dialog时停止工作(即关闭对话框).

如果对话框打开,并立即按ESC,也不会关闭对话框(如果您有启用),因为重点是对一些隐藏字段或什么的,并没有得到按键事件.

我修复它的方法是将其添加到open事件中以从第一个字段中删除焦点:

$('#myDialog').dialog({
    open: function(event,ui) {
        $(this).parent().focus();
    }
});
Run Code Online (Sandbox Code Playgroud)

这会将焦点设置到不可见的对话框,然后ESC键可以正常工作.

  • 这似乎是唯一可行的解​​决方案,不包括添加无用的HTML,删除tabindex或破坏ESC键. (2认同)

red*_*are 10

将输入的tabindex设置为-1,然后设置dialog.open以在以后需要时恢复tabindex:

$(function() {
    $( "#dialog-message" ).dialog({
        modal: true,
        width: 500,
        autoOpen: false,
        resizable: false,
        open: function()
        {
            $( "#datepicker1" ).attr("tabindex","1");
            $( "#datepicker2" ).attr("tabindex","2");
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • tabindex = -1会不会阻止我跳到文本框? (4认同)

小智 10

我的解决方法:

open: function(){
  jQuery('input:first').blur();
  jQuery('#ui-datepicker-div').hide();
},  
Run Code Online (Sandbox Code Playgroud)


the*_*man 7

我的内容比对话框长.在打开时,对话框将会弹到第一个:位于底部的tabbable.这是我的修复.

$("#myDialog").dialog({
   ...
   open: function(event, ui) { $(this).scrollTop(0); }
});
Run Code Online (Sandbox Code Playgroud)

  • 我的内容也很长.blur删除了选择,但将对话框滚动到底部.scrollTop将内容滚动到顶部但离开了选择.我最终使用$('...').blur(); $(本).scrollTop(0); 像冠军一样工作. (4认同)

小智 7

简单的解决方法:

只需使用tabindex = 1创建一个不可见的元素...这不会聚焦datepicker ...

例如.:

<a href="" tabindex="1"></a>
...
Here comes the input element
Run Code Online (Sandbox Code Playgroud)