Javascript Dojo ValidationTextArea小部件在无效时如何突出显示?
我正在尝试创建一个从ValidationTextBox继承的自定义Dojo ValidationIdBox小部件。我的自定义小部件将添加与后端服务器的异步重复ID检查 我对dijit.form.ValidationTextBox进行了子分类,并修改了两个方法:isValid()和validate()。然而,我无法让验证完全工作。该小部件捕捉并突出显示诸如缺少所需输入之类的问题。它甚至会在存在重复ID(工具提示出现)时捕获,但无法按预期高亮显示字段 我试图用下面一个简化的代码片段来隔离我的问题。它主要是原始的Dojo代码,有一些小的修改。我的一般策略是让小部件作为常规的ValidationTextBox进行验证,然后测试重复的ID。我将isValid()修改为两种模式:普通验证和带有唯一性检查的验证。目前,唯一性测试总是故意失败 以类似的方式,我修改了validate()以执行其正常操作,然后如果正常验证成功,但具有唯一性的验证测试失败,则执行一些额外的处理。我尝试镜像与ValidationTextBox处于Javascript Dojo ValidationTextArea小部件在无效时如何突出显示?,javascript,validation,dojo,widget,Javascript,Validation,Dojo,Widget,我正在尝试创建一个从ValidationTextBox继承的自定义Dojo ValidationIdBox小部件。我的自定义小部件将添加与后端服务器的异步重复ID检查 我对dijit.form.ValidationTextBox进行了子分类,并修改了两个方法:isValid()和validate()。然而,我无法让验证完全工作。该小部件捕捉并突出显示诸如缺少所需输入之类的问题。它甚至会在存在重复ID(工具提示出现)时捕获,但无法按预期高亮显示字段 我试图用下面一个简化的代码片段来隔离我的问题。它
错误
状态时相同的逻辑,但没有镜像相同的效果:“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;
},