Dojo:如何查找小部件在Dojo中是否具有焦点

Dojo:如何查找小部件在Dojo中是否具有焦点,dojo,focus,Dojo,Focus,如何确定自定义小部件在Dojo中是否具有焦点 我让dojo编辑器知道编辑器是否已经有焦点了?您可以使用dijit/focus模块查找焦点 来自DOJO文档 跟踪活动部件 在任何时候都有一套(因为没有更好的词) “活动”或“聚焦”小部件,指当前聚焦的小部件 还有那个小部件的祖先。“祖先”可以指任何一个DOM祖先 (例如:TextBox–>Form)或逻辑父子关系(例如: 工具提示对话框–>下拉按钮) 例如,如果焦点位于 TooltipDialog由下拉按钮触发,堆栈将 文本框–>内容窗格–>选项卡

如何确定自定义小部件在Dojo中是否具有焦点


我让dojo编辑器知道编辑器是否已经有焦点了?

您可以使用dijit/focus模块查找焦点

来自DOJO文档

跟踪活动部件

在任何时候都有一套(因为没有更好的词) “活动”或“聚焦”小部件,指当前聚焦的小部件 还有那个小部件的祖先。“祖先”可以指任何一个DOM祖先 (例如:TextBox–>Form)或逻辑父子关系(例如: 工具提示对话框–>下拉按钮)

例如,如果焦点位于 TooltipDialog由下拉按钮触发,堆栈将 文本框–>内容窗格–>选项卡容器–>工具提示对话框–> 下拉按钮

activeStack[]参数表示这组小部件和一个应用程序 可以通过以下方式监视对activeStack[]的更改:

require([ "dijit/focus" ], function(focusUtil){
 focusUtil.watch("activeStack", function(name, oldValue, newValue){
  console.log("Focused widget + ancestors: ", newValue.join(", "));
});
});
require([“dijit/focus”],函数(focusUtil){
var activeElement=focusUtil.curNode;//如果没有聚焦元素,则返回null
});

点击这里你可以看到一些例子

标题中的问题与描述中的问题答案不同

通过使用dojo的focusUtil(“dijit/focus”)有两种方法来解决标题中的问题。这两种方法都可以让您找到使用它的小部件和dijit的注册表(“dijit/registry”)

  • focusUtil.curNode
    :提供当前具有焦点的DOM节点。通过下面的函数,您可以获得小部件参考

    function getWidgetByNode(node){
        var result;
        while (!result && node){
            result = registry.byNode(node);
            if (node.parentElement)
                node = node.parentElement;
            else
                node = null;
        }
        return result;
    }
    var focusedWidget = getWidgetByNode(focusUtil.curNode)
    
  • focusUtil.activeStack
    :提供具有焦点的小部件数组(父到子)。因此,数组中的最后一项是具有焦点的direct小部件。索引值是小部件ID,因此您应该通过以下代码获得小部件

    var focusedWidgetId = focusUtil.activeStack[focusUtil.activeStack.length-1];
    var focusedWidget = registry.byId(focusedWidgetId);
    
  • 现在,如果您想知道当前关注的小部件是否是某个特定的小部件,这取决于您从该特定小部件手中获得了什么:

  • 小部件本身:与上述示例的返回值类似。现在,你必须比较这些是否是相同的东西。您不能使用
    =
    操作符比较两个小部件对象。您可以这样比较他们的ID:

    myWidget.id == focusedWidget.id
    
  • 小部件的id:通过这种方式,您只需从focusUtil轻松获取当前节点的id,并将其与您拥有的id进行比较,如下所示:

    myWidgetId == focusedWidgetId
    
  • 参考文献:

    a)对于Dojo1.6:调用
    dijit.getFocus()
    。这将返回一个包含当前关注的dom节点的对象,以及其他内容(所选文本等)。要获取相应的小部件,只需执行以下操作:

    var activeElement = dijit.getEnclosingWidget(dijit.getFocus().node);
    
    这是源代码中dijit.getFocus()的完整参考:

    // summary:
    //      Called as getFocus(), this returns an Object showing the current focus
    //      and selected text.
    //
    //      Called as getFocus(widget), where widget is a (widget representing) a button
    //      that was just pressed, it returns where focus was before that button
    //      was pressed.   (Pressing the button may have either shifted focus to the button,
    //      or removed focus altogether.)   In this case the selected text is not returned,
    //      since it can't be accurately determined.
    //
    // menu: dijit._Widget or {domNode: DomNode} structure
    //      The button that was just pressed.  If focus has disappeared or moved
    //      to this button, returns the previous focus.  In this case the bookmark
    //      information is already lost, and null is returned.
    //
    // openedForWindow:
    //      iframe in which menu was opened
    //
    // returns:
    //      A handle to restore focus/selection, to be passed to `dijit.focus`.
    
    b) 对于dojo 1.7及以上版本,请使用
    dijit/focus

    require([ "dijit/focus" ], function(focusUtil) {
        var activeElement = focusUtil.curNode; // returns null if there is no focused element
    });
    

    但是使用这个我怎么能检查我的自定义小部件是否有焦点??