捕获dijit.InlineEditBox中的击键?

时间:2014-04-02 21:56:12

标签: dojo dijit.form

我有一个带有dijit.form.TextArea的dijit.InlineEditBox作为编辑器。如何捕获击键?

我已尝试过(inlineEditBox," KeyPress",function()...)但似乎只连接到来自InlineEditBox-widget的事件,而不是来自TextArea-widget。

2 个答案:

答案 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/,这个例子。