Javascript Dojo ValidationTextArea小部件在无效时如何突出显示?

Javascript Dojo ValidationTextArea小部件在无效时如何突出显示?,javascript,validation,dojo,widget,Javascript,Validation,Dojo,Widget,我正在尝试创建一个从ValidationTextBox继承的自定义Dojo ValidationIdBox小部件。我的自定义小部件将添加与后端服务器的异步重复ID检查 我对dijit.form.ValidationTextBox进行了子分类,并修改了两个方法:isValid()和validate()。然而,我无法让验证完全工作。该小部件捕捉并突出显示诸如缺少所需输入之类的问题。它甚至会在存在重复ID(工具提示出现)时捕获,但无法按预期高亮显示字段 我试图用下面一个简化的代码片段来隔离我的问题。它

我正在尝试创建一个从ValidationTextBox继承的自定义Dojo ValidationIdBox小部件。我的自定义小部件将添加与后端服务器的异步重复ID检查

我对dijit.form.ValidationTextBox进行了子分类,并修改了两个方法:isValid()和validate()。然而,我无法让验证完全工作。该小部件捕捉并突出显示诸如缺少所需输入之类的问题。它甚至会在存在重复ID(工具提示出现)时捕获,但无法按预期高亮显示字段

我试图用下面一个简化的代码片段来隔离我的问题。它主要是原始的Dojo代码,有一些小的修改。我的一般策略是让小部件作为常规的ValidationTextBox进行验证,然后测试重复的ID。我将isValid()修改为两种模式:普通验证和带有唯一性检查的验证。目前,唯一性测试总是故意失败

以类似的方式,我修改了validate()以执行其正常操作,然后如果正常验证成功,但具有唯一性的验证测试失败,则执行一些额外的处理。我尝试镜像与ValidationTextBox处于
错误
状态时相同的逻辑,但没有镜像相同的效果:“ID不可用”工具提示出现,但带感叹号的红色轮廓没有出现

我检查过了,但我不知道这种特殊的样式是如何触发的有人能解释一下ValidationTextArea是如何工作的吗?具体来说,我不太清楚
是如何工作的。_maskValidSubsetError
aria invalid
this.state
都被使用了

(有时,我也希望工具提示出现,但不希望出现红色样式。希望在处理AJAX重复ID检查请求时显示。)


可能错过了明显的,隐藏在一片内联的&&&| | | | | | | | | | | | | | |

模糊/按键机制的要点是,工具提示将仅在当前显示的框上可见,因此_maskValid

您是否尝试过
this.set(“state”,this.isUnique()?:“Error”)


小部件是有状态的,.set可能会触发一个事件或发布一个主题

这样做。_set(“state”,“Error”)
启用红色验证边框。那么这个。_set(“state”,“Error”)应该删除它,对吗?“我不知道这种特殊的样式是如何触发的”“不知道你具体在问什么。”。然而,我可以告诉你,aria/WAI角色不应该是你所关心的——这是一个值得支持的好习惯,但它只适用于可访问性和屏幕阅读器,与styleshowever没有任何关系。您可能知道,“红色验证边框”在验证错误上可见,然后-当框接收到焦点时,将显示
工具提示
(消息),该提示在
missingMessage
invalidMessage
中设置-这是maskValidSubsetError的目的;了解如何对焦点作出反应
// If ValidationTextBoxValidates
isValid: function(isFocused, requireUnique) {
    if (typeof requireUnique === 'undefined') requireUnique = false;

    var isValid = this.inherited(arguments);
    var isUnique = false;

    return (requireUnique ? (isValid && isUnique) : isValid);
},

validate: function(/*Boolean*/ isFocused){
    // summary:
    //        Called by oninit, onblur, and onkeypress.
    // description:
    //        Show missing or invalid messages if appropriate, and highlight textbox field.
    // tags:
    //        protected
    var message = "";
    var isValid = this.disabled || this.isValid(isFocused);
    if(isValid){ this._maskValidSubsetError = true; }
    var isEmpty = this._isEmpty(this.textbox.value);
    var isValidSubset = !isValid && isFocused && this._isValidSubset();
    this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error"));
    this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");

    if(this.state == "Error"){
        this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
        message = this.getErrorMessage(isFocused);
    }else if(this.state == "Incomplete"){
        message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete
        this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused
    }else if(isEmpty){
        message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text
    }

    /// Begin custom widget code
    if (isValid && !this.isValid(isFocused, true) ) {
        isValid = false;

        var isValidSubset = !isValid && isFocused && this._isValidSubset();

        this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
        message = 'ID not available';

        this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
    }
    /// End custom widget code

    this.set("message", message);
    return isValid;
},