Jquery 如何在Safari中为自定义表单元素启用选项卡导航

Jquery 如何在Safari中为自定义表单元素启用选项卡导航,jquery,safari,custom-controls,Jquery,Safari,Custom Controls,Safari默认在使用tab键进行导航时只访问表单元素。使用自定义表单元素(如)时,在表单字段中导航时,这些元素将被禁用。如何在不更改默认设置的情况下使用tab键在导航中包含自定义表单元素?在jQuery Selectmenu前面有一个input元素,并向其添加一个事件处理程序,这样一旦获得焦点,它就会将焦点设置为jQuery Selectmenu。然后使用此CSS隐藏您添加的输入框:position:absolute;顶部:-9999px;左:-9999px $('input.hiddenIn

Safari默认在使用tab键进行导航时只访问表单元素。使用自定义表单元素(如)时,在表单字段中导航时,这些元素将被禁用。如何在不更改默认设置的情况下使用tab键在导航中包含自定义表单元素?

在jQuery Selectmenu前面有一个
input
元素,并向其添加一个事件处理程序,这样一旦获得焦点,它就会将焦点设置为jQuery Selectmenu。然后使用此CSS隐藏您添加的输入框:
position:absolute;顶部:-9999px;左:-9999px

$('input.hiddenInput').focus(function(){
   var cameFrom = $('#myForm').data('lastIn');

   //check whether it came from the jQuery select menu
   if(cameFrom != 'jquery-ui-element'){
       $('jquery-ui-element').focus();
   } else {
       //focus previous sibling
       var inp = $('input');
       var index = inp.index(this);
       var prev = inp[index-1];
       prev.focus();
   }
});
编辑:为了防止在shift+tab之后再次聚焦,您可以这样做

$('#myForm input').focusout(function () {
   $('#myForm').data('lastIn', $(this).attr('name'));
});

在jQuery Selectmenu前面有一个
input
元素,并向其中添加一个事件处理程序,这样一旦它获得焦点,就会将焦点设置到jQuery Selectmenu。然后使用此CSS隐藏您添加的输入框:
position:absolute;顶部:-9999px;左:-9999px

$('input.hiddenInput').focus(function(){
   var cameFrom = $('#myForm').data('lastIn');

   //check whether it came from the jQuery select menu
   if(cameFrom != 'jquery-ui-element'){
       $('jquery-ui-element').focus();
   } else {
       //focus previous sibling
       var inp = $('input');
       var index = inp.index(this);
       var prev = inp[index-1];
       prev.focus();
   }
});
编辑:为了防止在shift+tab之后再次聚焦,您可以这样做

$('#myForm input').focusout(function () {
   $('#myForm').data('lastIn', $(this).attr('name'));
});

这就是我最终得到的解决方案:

select{
  display: block !important;
  left: -9999;
  position: absolute !important;
}
如果设置为顶部:-9999,当元素获得焦点时,页面将滚动到顶部,因此我跳过了该选项。我重用selectmenu插件应用到的原始select元素。重要语句用于覆盖插件应用的元素样式

selectmenu插件自动将焦点设置为a元素,这样,当选择项被聚焦时,无需javascript即可将焦点放置在自定义下拉列表上。但是,这使向后制表变得不可能(使用shift),因为这会将焦点从自定义元素更改为原始元素,从而将焦点设置回自定义元素

我是这样解决这个问题的:

$('.ui-selectmenu').on('keydown', function(e){
  if(e.shiftKey && e.keyKode === 9){
    var all = $(':input'),
        el = $(this).parent().prev('select'),
        i = all.index(el);
    all.eq(i).focus();
});

在这里,我将所有输入存储在一个变量中,找到我的select元素,并将焦点设置为上一个元素。

因此,这就是我最终得到的解决方案:

select{
  display: block !important;
  left: -9999;
  position: absolute !important;
}
如果设置为顶部:-9999,当元素获得焦点时,页面将滚动到顶部,因此我跳过了该选项。我重用selectmenu插件应用到的原始select元素。重要语句用于覆盖插件应用的元素样式

selectmenu插件自动将焦点设置为a元素,这样,当选择项被聚焦时,无需javascript即可将焦点放置在自定义下拉列表上。但是,这使向后制表变得不可能(使用shift),因为这会将焦点从自定义元素更改为原始元素,从而将焦点设置回自定义元素

我是这样解决这个问题的:

$('.ui-selectmenu').on('keydown', function(e){
  if(e.shiftKey && e.keyKode === 9){
    var all = $(':input'),
        el = $(this).parent().prev('select'),
        i = all.index(el);
    all.eq(i).focus();
});

在这里,我将所有输入存储在一个变量中,找到我的select元素,并将焦点设置为上一个元素。

我喜欢:)但是,它打破了shift键切换,因为selectmenu之前的元素是select元素,将焦点反弹回selectmenu。我正在研究一个解决方案。@Jørgen,你现在能检查一下吗。我用一个解决方案编辑了这篇文章。谢谢,我不太喜欢这个解决方案,但你让我走上了正轨,所以我接受:)我喜欢:)但是,它打破了shift tabbing,因为selectmenu之前的元素就是select元素,将焦点反弹回selectmenu。我正在研究一个解决方案。@Jørgen,你现在能检查一下吗。我用一个解决方案编辑了这篇文章。谢谢,我不太喜欢这个解决方案,但你让我走上了正轨,所以我接受:)