我在顶部有一个浮动条,当用户向上或向下滚动页面时,它会显示/隐藏。当Dojo /浏览器以编程方式滚动页面时,我需要完全隐藏它,例如将焦点放在表单中的无效元素时。
是否可以知道由于用户输入而发生了滚动?
答案 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
)。