【问题标题】:jQuery hotkeys...not so globaljQuery 热键...不是那么全球化
【发布时间】:2012-05-11 05:58:54
【问题描述】:

基本上,我正在使用 Resig 先生的 jQuery Hotkeys plugin 来捕获和处理诸如 ctrl+o 等的快捷方式...

好吧,也许我不理解这个概念,但我的印象是,文档内的 anywhere 触发的ctrl+o 将被文档热键处理程序捕获。

例如,下面的代码一般都可以工作...

jQuery(document).bind('keydown', 'ctrl+o', fn);

但是,如果用户在输入框内触发热键,它会非常失败。

仅当我执行以下操作时才有效:

jQuery('body, input').bind('keydown', 'ctrl+o', fn);

这对我的健康非常不利,因为每次将新的输入框添加到 DOM 时都会绑定该死的处理程序。更糟糕的是,对于像 CodeMirror 这样的复杂小部件,我不知道要绑定什么。

不知道我的问题是否有意义,也许我使用了错误的方法?我也尝试绑定到以下对象,但没有成功:windowdocumentbodydiv[contains the whole page]

注意:你可以try it out here

【问题讨论】:

  • 也许你可以在这里使用on()?所以它适用于每一个添加的输入。还是我错过了什么?
  • @Topener 我不想只是绑定到所有 current 输入,但也不想绑定到任何 future 输入.以这种方式添加事件的好处在于您不需要全局变量来包含事件处理函数,您只需在需要时执行一次。
  • 但是这里的重点不是我添加事件,而是热键功能应该自己做。我的意思是,这就是热键的意义......在 Netbeans 编辑器中按 ctrl+s 会产生与在 netbeans 项目列表中执行此操作相同的效果(例如)。
  • 类似 jQuery('body').bind(...) 和 jQuery('body').children().bind(...) 的东西?
  • @Edward 也许它太难掌握了,但这里有:.children() 或任何其他 jQuery 选择器适用于 现有元素,而不是将来可能添加的任何元素.我需要全局热键,而不是每次更改 DOM 时都绑定事件。

标签: jquery events dom hotkeys codemirror


【解决方案1】:

这实际上是插件的预期功能:

// Don't fire in text-accepting inputs that we didn't directly bind to
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
    event.target.type === "text") ) {
    return;
}

【讨论】:

  • 好吧,老实说,我不知道如何在不更改代码的情况下解决我的问题:(
  • 我想我可以传递一个选项来禁用该功能...然后向 Resig 提交补丁...
  • 是的,如果不以某种方式修改插件,我看不到解决办法。
  • 好吧,感谢您指出。不知道为什么我没有想到首先检查插件代码...
  • 我很高兴地宣布,这也解决了我的 CodeMirror 问题。
【解决方案2】:

是的,如果用户在输入框内触发热键,JqueryHotkeys 会惨遭失败。

另外,当我浏览时,我发现了shortcut.js,它提供了与 Jquery-Hotkeys 类似的功能。

重要的是它还可以在输入框内启用或禁用“用户定义的快捷方式功能”。

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多