【问题标题】:trigger or return shift+tab in javascript or JQuery在 javascript 或 JQuery 中触发或返回 shift+tab
【发布时间】:2012-02-15 16:52:38
【问题描述】:

我使用 tabIndex 为带有二维导航的 Windows CE 制作了一个页面。一开始我只是想用tabIndex作为下一个焦点的参考。

因为这个应用程序是用于便携式设备的,所以这样做对手持设备要求很高,与简单的 tab 和 shift+tab 相比非常耗时。

我有一个函数来处理我的向上箭头和向下箭头的 onkeydown, 对于我的向下箭头,代码很简单

if(specialMove == 0){所有这一切都是检查标签没有离开页面。

event.keyCode=9; return;}

问题是我的向上箭头,我希望它返回一个 SHIFT+TAB 以向上导航,我找到了这段 jQuery 代码,但我在使它工作时遇到了问题。

if(specialMove == 0){
    $('body').trigger(JQuery.Event('keydown', {keyCode:9, shiftKey: true}));
    return;
}

【问题讨论】:

  • 您使用的是什么 CE 版本/设备/浏览器?
  • CE 2.0 如果我没记错的话,MC9090 和 IE6

标签: jquery tabs navigation keycode shift


【解决方案1】:

在这种情况下,Trigger 只调用定义在 body 上的事件处理程序。它不会将密钥代码发送到浏览器。见:http://api.jquery.com/trigger/。简而言之,它只执行 jQuery 知道在 keydown 事件的情况下会执行的代码。它“模拟”了一个 keydown 事件。

据我所知,向浏览器发送关键事件是不可能的,因为这会带来一些严重的安全风险。您必须在 Javascript 中实现选择下一个和上一个元素。

编辑: 您可以尝试以下方法:

$(function() {
  var navigationElements = $('[tabIndex]').sort(function(a,b) {
    return $(a).attr('tabindex') - $(b).attr('tabindex');
  });

  // We don't know if the users presses the up or down button first
  // so we initialize as null and let the event handle the first element
  var currentIndex = null;

  // On event:
  if (currentIndex != null && currentIndex < navigationElements.length - 1) {
    navigationElements[++currentIndex].focus();
  } else {
    currentIndex = 0;
    navigationElements[currentIndex].focus();
  }

  // and:
  if (currentIndex != null && currentIndex > 0) {
    navigationElements[--currentIndex].focus();
  } else {
    currentIndex = navigationElements.length - 1;
    navigationElements[currentIndex].focus();
  }
});

这是未经测试、未经优化的代码,因此可能有更好的解决方案,但即使在速度较慢的浏览器上也能很快工作。它不考虑不通过您的事件的焦点更改,因此您必须添加onfocus 事件以将currentIndex 设置为用户最后选择的元素。

【讨论】:

  • 但是您可能会使用该事件来查找上一个(或下一个)输入,按 tabIndex 排序,并将焦点移到那里。实际上,这对于非触摸式手机的移动网站可能非常有用。
  • 我对此表示怀疑,因为下一个或上一个元素永远不会被选中。您必须找到所有可以选择的元素,按 DOM 和/或选项卡索引中的位置对它们进行排序,然后相对于当前选定的项目在树中上下移动。在桌面或现代移动浏览器上做起来很简单,但是 Windows CE 呢?我不太确定...
  • 这就是我现在正在做的事情,我的标签按 tabindex 排序,我使用 $('[tabIndex='+currIndex+']').focus(); 搜索下一个标签索引,但是这样做会延迟大约一秒,这也是长期使用,我不知道 getelementbyid 或 class 是不是比我的 jquery 命令更快的搜索方式。
  • 您可以尝试在页面加载后缓存数组中所有元素的列表并对其进行迭代:elements[currentIndex++].focus()。这可以防止每次点击都进行 DOM 操作。您只需要跟踪用户的手动焦点更改(如果可能在浏览器上)。
  • 我无法让 navigationElements 运行,这就是我的代码(简化)我所做的只是将 $('[tabIndex=currIndex]') 更改为 navigationElements[currIndex].focus(); 和 navigationElements 我的代码:` var navigationElements = $('[tabIndex]').sort(function(a,b) { return $(a)​​.attr('tabindex') - $(b).attr('tabindex'); });功能导航(){ currIndex = document.activeElement.tabIndex; if(event.keyCode == 38) currIndex--;否则 if(event.keyCode == 40){ event.keyCode=9;返回; } 导航元素[currIndex].focus(); }`
【解决方案2】:

const keyupEvent = new Event('KeyboardEvent');
keyupEvent.initEvent('keyup');
Object.defineProperties(keyupEvent, {
  keyCode: {
    value: 9
  },
  shiftKey: {
    value: true
  }
});

...

element.dispatch(keyupEvent);

【讨论】:

  • 欢迎来到 Stack Overflow。通常可以通过添加一些关于它们的工作原理和原因的解释来改进纯代码的答案。
  • 在打字稿中,会 htmlelement.dispatchEvent(keyupEvent);
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2015-06-05
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多