Javascript Dojo-按escape键时防止dijit/弹出取消

Javascript Dojo-按escape键时防止dijit/弹出取消,javascript,dojo,Javascript,Dojo,我使用dijit/popup在单击按钮时显示对话框小部件。下面的文档描述了如何使用dijit/popup控制弹出窗口 代码如下: define(["dijit/popup"], function(popup){ ... // wrap the pop-up widget and position it offscreen so // that it can be measured by the widget’s startup method popup.moveOffScreen(dropD

我使用dijit/popup在单击按钮时显示对话框小部件。下面的文档描述了如何使用dijit/popup控制弹出窗口

代码如下:

define(["dijit/popup"], function(popup){
...

// wrap the pop-up widget and position it offscreen so
// that it can be measured by the widget’s startup method
popup.moveOffScreen(dropDown);

// if the pop-up has not been started yet, start it now
if(dropDown.startup && !dropDown._started){
    dropDown.startup();
}

// make the pop-up appear around my node
popup.open({
    parent: this,
    popup: dropDown,
    around: this.domNode,
    orient: ["below-centered", "above-centered"],
    onExecute: function(){
        popup.close(dropDown);
    },
    onCancel: function(){
        popup.close(dropDown);
    },
    onClose: function(){
    }
});

...
但是,dijit/popup的默认行为是在弹出的小部件发出取消信号或按下ESC键时调用onCancel回调函数:

当按下ESCape键时,我可以看到这种情况发生,但是我不希望因按ESC(或TAB)键而关闭对话框-如何实现这一点?如何检测用户按下Escape键时执行onCancel回调


或者,只有在按下escape键时,我如何防止dijit/popup调用onCancel?

似乎没有干净的方法可以做到这一点。您可以做的是抑制弹出/下拉菜单的escape key事件。为此,必须在弹出窗口显示后设置密钥处理程序。为此,您需要打开弹出窗口的函数名,并且需要访问弹出窗口本身或其父级。请注意,弹出窗口位于DOM中的一个随机位置,并且不是打开/删除它的小部件的子部件。例如,DateTextBox调用openDropDown函数来打开其日历小部件并将其存储在成员下拉列表中。您可以抑制按键事件,使下拉列表不会使用escape键关闭,如下所示:

require([
    "dijit/form/DateTextBox",
    "dojo/aspect",
    "dojo/on",
    "dojo/keys",
    "dojo/domReady!"
], function(DateTextBox, aspect, on, keys){

    var dateBox = new DateTextBox({});
    aspect.after(dateBox, "openDropDown", function () {
        on(this.dropDown, "keydown", function(event)
        {
            if (event.keyCode == keys.ESCAPE)
            {
                event.stopPropagation();
                event.preventDefault();
                return;
            }
        });
    });
    dateBox.placeAt("datebox");
    dateBox.startup();
});

您可能需要在弹出窗口中添加一个附加函数(或现有函数的一个方面),以在弹出窗口打开后公开它(与上面代码段中的此.dropDown等效)。

简单方法:确保此.domNode是常规DIV元素。创建连接到此domNode的onClick侦听器,以显示弹出窗口。这样弹出窗口会忽略ESC按钮或用户点击弹出窗口周围的空白空间。您必须通过弹出窗口隐藏它。从弹出窗口或弹出窗口内关闭(此)。从外部关闭(此下拉菜单)。
无需抑制/覆盖任何内容。

谢谢,我需要在我的场景中测试这一点。我需要确保对下拉小部件忽略ESC,但不会阻止其他小部件的传播。在我的例子中,ArcGIS Javascript API Draw工具栏使用escape停止在地图上绘制功能,因此我希望它能够工作,并且弹出对话框保持打开状态。您可能需要将此逻辑添加到事件处理程序中,即在调用StopRogation()之后停止绘制然后返回。我尝试过这样做,但我似乎无法阻止ESC键从map draw工具传播,esri小部件似乎可以阻止它被任何处理程序截获。如果当我打开弹出窗口时,我在窗口/地图/地图层上附加了一个全局按键处理程序-一旦我开始绘制,它仍然不会拦截按键。谢谢你的建议-你有一个简单的工作示例吗?在我的例子中,我以编程方式打开弹出窗口。单击按钮或单击地图上的链接时,需要打开该对话框。我尝试创建一个直接连接到div的弹出窗口,但是当我尝试打开弹出窗口时,我得到了一个错误-对象不支持属性或方法“isLeftToRight”