我有一个以dijit.InlineEditBox为编辑器的dijit.form.TextArea。我该如何捕捉击键?
我试过(inlineEditBox,"KeyPress",函数().)但这似乎只连接到InlineEditBox-小部件中的事件,而不是TextArea-小部件。
发布于 2014-04-11 20:23:56
我认为,在较早版本的dojo (<1.6)中,您过去可以将onKeyPress函数传递给InlineEditBox的"editorParams“属性。但我认为在最近的版本中,这要么被删除,要么有一个bug使它无法工作。在最近版本的Dojo中,我在InlineEditBox的“InlineEditBox”中添加了一个侦听器。我做了这样的事:
on(eb.wrapperWidget.editWidget, "keypress", function (evt) {
console.log("EVT:", evt);
});其中eb是InlineEditBox。但是,直到第一次单击wrapperWidget时才创建InlineEditBox,因此我必须提供一种初始化wrapperWidget的方法。
eb.edit();
eb.cancel();在最近版本的Dojo中,我可能还没有看到更好的方法,但这是一个可行的解决方案。为了提供帮助,我为这个示例创建了一个JSFiddle,http://jsfiddle.net/N5WPk/。
发布于 2014-04-11 13:50:29
您正在使用on()函数连接到InlineEditBox。如果您想从文本区域捕获事件,那么在on()中引用该小部件。此外,我建议使用onKeyUp并获得以下值:
var textarea = new Textarea({
name: "myarea",
onKeyUp: function(event){
// get the value and do something with it
}
style: "width:200px;"
}, "myarea").startup();;
});编辑:
实际上,dojo并不希望您能够这样做:)
主要问题是,直到第一次单击编辑器时,Textarea才会实例化,因此您必须连接到onBlur事件,然后才能获得对小部件的引用。然后,您可以访问textarea的ID,查找小部件,并创建到keyup事件的连接。为了防止过多的事件处理程序,您需要在每次编辑完成后销毁事件的句柄,然后在下次有人选择文本区域时再重新构建它。而且,我使用的是dijit.registry.byId,但是很明显,如果您使用的是amd加载程序,那么就不是这样做的。
这真的很恶心,但很管用:
var editBox = registry.byId("editBox");
var blurHandle = editBox.on("blur", function(value){
console.info("only run once");
var textArea = dijit.registry.byId(editBox._focusManager.activeStack[1]);
var keyupHandle = textArea.on("keyUp", function(event){
console.info("value: ", event.keyCode);
});
editBox.on("change", function(value){
keyupHandle.remove();
});
});https://stackoverflow.com/questions/22823896
复制相似问题