我有一个带有dijit.form.TextArea的dijit.InlineEditBox作为编辑器。如何捕获击键?
我已尝试过(inlineEditBox," KeyPress",function()...)但似乎只连接到来自InlineEditBox-widget的事件,而不是来自TextArea-widget。
答案 0 :(得分:0)
您使用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();
});
});
答案 1 :(得分:0)
我认为在旧版本的dojo(< 1.6)中,您曾经能够将onKeyPress函数传递给InlineEditBox" s" editorParams"属性。但我认为在更新的版本中,要么已删除,要么存在使其无效的错误。在最近的Dojo版本中,我已经为" editWidget"添加了一个监听器。 InlineEditBox。我做这样的事情:
on(eb.wrapperWidget.editWidget, "keypress", function (evt) {
console.log("EVT:", evt);
});
其中eb是InlineEditBox。但是,在第一次单击InlineEditBox之前,不会创建wrapperWidget,因此我必须提供一种初始化wrapperWidget的hacky方式。
eb.edit();
eb.cancel();
在我最近看到的Dojo版本中可能有更好的方法,但这是一个有效的解决方案。为了提供帮助,我已经创建了一个JSFiddle,http://jsfiddle.net/N5WPk/,这个例子。