是否可以区分dojo中的编程和用户滚动?

时间:2014-01-07 12:41:13

标签: javascript html html5 dojo

我在顶部有一个浮动条,当用户向上或向下滚动页面时,它会显示/隐藏。当Dojo /浏览器以编程方式滚动页面时,我需要完全隐藏它,例如将焦点放在表单中的无效元素时。

是否可以知道由于用户输入而发生了滚动?

1 个答案:

答案 0 :(得分:0)

这通常不能完成,但可以在问题中提到的特定情况下完成,即检测到滚动发生,因为Dojo试图将焦点放在表单中的无效元素上。要做到这一点,有必要覆盖validate中的dijit/form/Form方法,以便它可以自动覆盖表单中所有小部件中的focus方法:

    validate: function(){
        var self = this;
        var children = this._getDescendantFormWidgets();
        array.forEach(children, function(child){
            if(typeof(child.focus) === "function" && !child._uuiIsModded){
                child._uuiOldFocus = child.focus;
                child.focus = self._onProgrammaticFocus;
                child._uuiIsModded = true;
            }
        });

        return this.inherited(arguments);
    },

    _onProgrammaticFocus: function(){
        topic.publish("on-programmatic-focus", this);
        this._uuiOldFocus.apply(this, arguments);
    },

新的validate方法修改了表单中包含的所有小部件。修正是使用自定义方法focus替换标准_onProgrammaticFocus方法,该方法在调用标准on-programmatic-focus方法之前触发事件focus。这样,只有当焦点以编程方式放在窗口小部件上以响应验证错误而不是用户选择窗口小部件时才会触发事件:

  • 当用户通过使用鼠标选择小部件或点击小部件来关注小部件时,focus方法未被调用
  • 当表单窗口小部件包含无效值时,validate方法的标准行为是使用显示验证错误的CSS类修改窗口小部件,并通过调用focus方法将焦点放在窗口小部件上。在这种情况下,焦点应该已经修改,并启动“程序上关注”事件。

请记住,这是一个替代标准focus方法的黑客,如果代码的其他部分出现问题,可能无效。具体来说,在某些情况下,如果包含其他小部件的小部件不继承__uuiOldFocus,则dijit/_Container可能会变为未定义。这是因为this._getDescendantFormWidgets()会从toObject返回与方法dom/dom-form不同的子项。表单验证中使用的方法this._getDescendantFormWidgets()依赖于以下事实:包含其他小部件的所有小部件都应继承dijit/_Container mixin(使用当前DOM节点初始化this.containerNode)。