jQuery快捷键...不是那么全局化

10

我基本上是在使用 jQuery Hotkeys 插件(由 Resig 先生编写)来捕获和处理快捷键,例如 ctrl+o 等...

好的,也许我没有理解这个概念,但我的印象是,在文档中的任何地方触发的 ctrl+o 快捷键都将被文档快捷键处理程序捕获。

例如,下面的代码通常是有效的...

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

然而,如果用户在输入框中触发快捷键,则它会失败地执行。

只有按照以下步骤才能正常工作:

jQuery('body, input').bind('keydown', 'ctrl+o', fn);
这对我的健康非常不利,因为每次向DOM添加新的输入框时都需要绑定该可恶的处理程序。更糟糕的是,在像CodeMirror这样复杂的小部件中,我不知道要绑定到什么。不确定我的问题是否有意义,也许我使用了错误的方法?我还尝试将处理程序绑定到以下对象,但它们没有起作用:windowdocumentbody包含整个页面的divNB: 您可以在此处尝试

也许你可以在这里使用 on()?这样它就可以与添加的每个输入一起工作。或者我漏掉了什么? - Rene Pot
@Topener 我不仅想绑定到所有当前的输入,还想绑定到任何未来的输入。通过这种方式添加事件的美妙之处在于,您不需要全局变量来包含事件处理函数,只需在需要时执行一次即可。 - Christian
但这里的重点不是我添加事件,而是热键功能应该自己完成它。我的意思是,这就是热键的作用...在Netbeans编辑器中按下ctrl+s会产生与在Netbeans项目列表中执行相同的效果(以此为例)。 - Christian
或许这很难理解,但是我来试试:.children() 或其他任何 jQuery 选择器都是作用于已存在的元素,而不是未来可能添加的元素。我需要全局热键,而不是每次 DOM 改变时都绑定事件。 - Christian
@Christian,它确实可以:http://jsfiddle.net/wycAd/1/ - Rene Pot
显示剩余4条评论
2个回答

6

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

// 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;
}

说实话,如果不改那段代码,我不知道该怎么解决我的问题 :( - Christian
我想我可以传递一个选项来禁用该功能...然后向Resig提交一个补丁... - Christian
是的,我没有看到任何不修改插件的方法。 - James Montagne
好的,谢谢你指出来。不知道为什么我一开始没想到去检查插件代码... - Christian
2
我很高兴地宣布,这也解决了我在CodeMirror中遇到的问题。 - Christian
@Christian 我知道这是一个古老的、古老的、古老的帖子,但是它是如何解决你的问题的呢?你是分叉脚本,修改了它并使用了自己的版本吗?我可以问一个后续问题,但它可能会被关闭为重复! :) - bertieb

1

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

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

重要的是,它还有一个选项,在输入框内时启用或禁用“用户定义的快捷键函数”。


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