【问题标题】:Dojo: set default TextBox for typingDojo:设置默认的 TextBox 用于输入
【发布时间】:2015-09-21 07:28:48
【问题描述】:

希望在页面加载时将光标设置在搜索字段上。代码:

<input class="search-input"
  data-dojo-type="dijit/form/TextBox"
  data-dojo-attach-point="searchNode"
  data-dojo-attach-event="keyup: searchKeyUpEvent"
  data-dojo-props="
    focused: true,
    placeHolder: 'Search'" />

在页面加载时,TextBox 小部件有一个焦点框架,但光标不存在..

  • 这是一个错误吗?
  • 如何确保光标位于搜索小部件上?

编辑: 我将重新表述这个问题:如何设置一些 TextBox,所以当页面加载并且用户开始输入时,它会默认出现在该 TextBox 中?

【问题讨论】:

    标签: javascript dojo focus


    【解决方案1】:

    focused_FocusMixin 中记录为只读属性;最初设置它不会像你想象的那样做。

    要最初聚焦小部件,您需要从 JS 获取对它的引用并调用其 focus 方法。

    鉴于您已经定义了一个附加点和附加事件,我假设这个小部件是另一个小部件模板的一部分,在这种情况下,您应该能够最初将它集中在模板化小部件的 startup 方法中(尽管根据您的页面/应用程序的加载方式,可能会有更好的时间来执行此操作):

    startup: function () {
        if (this._started) {
            return;
        }
        this.inherited(arguments);
    
        this.searchNode.focus();
    });
    

    (我可能建议不要将附加点称为“searchNode”,因为在这种情况下它是一个小部件,而不是一个 DOM 节点。)

    【讨论】:

    • 感谢您的回答。由于某种原因 focus() 不起作用。我添加了常规 并尝试在 startup() 上 document.getElementById("foo") .. 但没有任何反应。这有意义吗?
    • 在你的例子中,你也应该使用 this.searchNode.focusNode.focus() (因为 focusNode 将是一个 元素,并且JS的 focus() 应该应用于一个dom元素,不是小部件实例。
    • focus 是在 dijit TextBox 小部件(更具体地说,_FormWidgetMixin)上定义的方法,它完全按照您的建议 (this.focusNode.focus())。
    【解决方案2】:

    花了几个小时并尝试了一堆解决方案(没有一个有效)后,我找到了一个真正解决问题的解决方案 - 使用 setTimeout()

    window.setTimeout(function(){
      _this.searchNode.focusNode.focus();
    }, 0);
    

    我不喜欢使用计时器(甚至是零时间计时器)的想法,但这可能是唯一的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多