Javascript 跨选项卡的Dojo表单验证

Javascript 跨选项卡的Dojo表单验证,javascript,forms,validation,dojo,tabs,Javascript,Forms,Validation,Dojo,Tabs,嗨,我对dojo的表单dijit的表单验证有问题,在哪里 我在表单中有两个或多个选项卡。如果选项卡上有无效的字段 2但当我验证时(通过按submit/ok按钮),我被定位在tab1上,验证方法确实执行,但它无法找到错误的dijit(切换到正确的选项卡)并专注于它。 此时将显示invalidMessage,但它将位于窗口的左上角 它应该在哪里。 是否有一种方法可以实现这一点,或者有一种适用于Dojo1.6的变通方法?如果您能提供任何信息,我们将不胜感激,谢谢 如果您使用的是dijit.form.f

嗨,我对dojo的表单dijit的表单验证有问题,在哪里 我在表单中有两个或多个选项卡。如果选项卡上有无效的字段 2但当我验证时(通过按submit/ok按钮),我被定位在tab1上,验证方法确实执行,但它无法找到错误的dijit(切换到正确的选项卡)并专注于它。 此时将显示invalidMessage,但它将位于窗口的左上角 它应该在哪里。
是否有一种方法可以实现这一点,或者有一种适用于Dojo1.6的变通方法?如果您能提供任何信息,我们将不胜感激,谢谢

如果您使用的是dijit.form.form(看起来就是这样),我认为最简单的方法是重写表单的validate函数。看看dijit.form.form的原始验证函数定义(在_FormMixin.js中):


您可以改变
if(!valid&&!didFocus){
条件,查找未通过验证的小部件打开了哪个选项卡并切换到它。

这对我来说很有效。它只检查父项是否是选项卡(有点难看,所以欢迎建议),如果是,则获取其父项并激活该选项卡。 它扩展了scrollIntoView,因为在我看来这是正确的功能。这意味着如果你在标签上滚动一个小部件进入视图,标签就会自动激活

只需确保此代码在某个地方运行即可

define([
"dojo/_base/window",
"dojo/aspect",
"dojo/dom",
"dojo/dom-class",
"dojo/window",
"dijit/registry"
], function (baseWindow, aspect, dom, domClass, win, registry) {
    //extend scrollintoview to make sure, if the element resides on a tab, the tab is activated first.
    aspect.around(win, "scrollIntoView", function (originalScrollIntoView) {
        return function (node, pos) {
            node = dom.byId(node);
            var doc = node.ownerDocument || baseWindow.doc,
                body = baseWindow.body(doc),
                html = doc.documentElement || body.parentNode;
            if (node == body || node == html) { return; }

            var widget = registry.byNode(node.domNode || node);
            if (typeof widget != "undefined" && widget != null) {
                if (typeof widget.getParent != "undefined") {
                    var par = widget.getParent();
                    if (domClass.contains(node.domNode || node, 'dijitTabPane')) {
                        if (typeof par.selectChild != "undefined") {
                            try {
                                par.selectChild(widget);
                            } catch (e) { }
                            return;
                        }
                    }
                    if (domClass.contains(par.domNode, 'dijitTabPane')) {
                        this.scrollIntoView(par.domNode);
                    }
                }
            }
        }
        return originalScrollIntoView(node, pos);
    });
});
define([
"dojo/_base/window",
"dojo/aspect",
"dojo/dom",
"dojo/dom-class",
"dojo/window",
"dijit/registry"
], function (baseWindow, aspect, dom, domClass, win, registry) {
    //extend scrollintoview to make sure, if the element resides on a tab, the tab is activated first.
    aspect.around(win, "scrollIntoView", function (originalScrollIntoView) {
        return function (node, pos) {
            node = dom.byId(node);
            var doc = node.ownerDocument || baseWindow.doc,
                body = baseWindow.body(doc),
                html = doc.documentElement || body.parentNode;
            if (node == body || node == html) { return; }

            var widget = registry.byNode(node.domNode || node);
            if (typeof widget != "undefined" && widget != null) {
                if (typeof widget.getParent != "undefined") {
                    var par = widget.getParent();
                    if (domClass.contains(node.domNode || node, 'dijitTabPane')) {
                        if (typeof par.selectChild != "undefined") {
                            try {
                                par.selectChild(widget);
                            } catch (e) { }
                            return;
                        }
                    }
                    if (domClass.contains(par.domNode, 'dijitTabPane')) {
                        this.scrollIntoView(par.domNode);
                    }
                }
            }
        }
        return originalScrollIntoView(node, pos);
    });
});