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

时间:2013-05-18 10:34:06

标签: dojo focus

如何在道场中查明我的自定义窗口小部件是否关注

我有dojo编辑器,我知道编辑器是否已经关注?

4 个答案:

答案 0 :(得分:3)

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

来自DOJO DOCS

  

跟踪活动小部件

     

在任何时候都有一套(因为没有更好的词)   “活动”或“聚焦”小部件,意味着当前关注的小部件   而那个小部件的祖先。 “祖先”可以指祖先的祖先   (例如:TextBox - > Form),或逻辑父子关系(例如:   TooltipDialog - > DropDownButton)。

     

例如,如果焦点位于一个TabContainer内的TextBox中   由DropDownButton触发的TooltipDialog,堆栈就是   TextBox - > ContentPane - > TabContainer - > TooltipDialog - >   DropDownButton。

     

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

require([ "dijit/focus" ], function(focusUtil){
 focusUtil.watch("activeStack", function(name, oldValue, newValue){
  console.log("Focused widget + ancestors: ", newValue.join(", "));
});
});

答案 1 :(得分:3)

标题中的问题与答案中的答案不同。

通过使用dojo的 focusUtil(“dijit / focus”),有两种方法可以在标题中实现这个问题。两种方式都可以找到你可以找到使用它的小部件和dijit的注册表(“dijit / registry”)

  1. 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)
    
  2. focusUtil.activeStack :为您提供一系列具有焦点的小部件(父级到子级)。所以数组中的最后一项是具有焦点的直接小部件。索引值是小部件ID,因此您应该通过以下代码获取小部件

    var focusedWidgetId = focusUtil.activeStack[focusUtil.activeStack.length-1];
    var focusedWidget = registry.byId(focusedWidgetId);
    
  3. 现在,如果你想知道当前关注的小部件是否是某个特定小部件,它取决于你手中的特定小部件:

    1. 小部件本身:就像上面示例的返回值一样。现在你必须比较这些是否相同。您无法使用==运算符比较两个窗口小部件对象。你可以这样比较他们的ID:

      myWidget.id == focusedWidget.id
      
    2. 小部件的ID:这样您就可以轻松地从focusUtil获取当前节点的ID,并将其与您所拥有的ID进行比较:

      myWidgetId == focusedWidgetId
      
    3. 参考文献:
      http://dojotoolkit.org/reference-guide/1.9/dijit/focus.html
      http://dojotoolkit.org/reference-guide/1.9/dijit/registry.html

答案 2 :(得分:0)

require([“dijit / focus”],function(focusUtil){
var activeElement = focusUtil.curNode; //如果没有聚焦元素,则返回null
});

查看打击网址,你可以看到一些例子 http://dojotoolkit.org/reference-guide/1.8/dijit/focus.html#dijit-focus

答案 3 :(得分:0)

a)对于 dojo 1.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
});