javascript - 突出显示/错误不适用于“远程”验证
问题描述
我将jquery-validate与 Bootstrap 4 和 chargify 一起使用,这需要在初始化时进行一些自定义。视觉自定义和 submitHandler 似乎不是问题。但是,我也在使用“远程”选项(文档),这似乎是我的问题所在。我当前的初始化是这样的:
// note: app.form is a cached jQuery object wrapping the form in question
app.form.validate({
submitHandler: function (form) {
if (form.valid()) {
chargify.token(
form,
function success(token) {
document.querySelector('#chargifyToken').value = token;
form.submit();
},
function error(err) {
console.log('token ERROR - err: ', err);
}
);
}
},
highlight: function (element) {
$(element).addClass('is-invalid');
},
unhighlight: function (element) {
$(element).removeClass('is-invalid');
},
errorClass: 'invalid-feedback',
errorElement: 'div',
rules: {
"subDomain": {
required: true,
minlength: 2,
remote: '../servlet/CheckSubDomainServlet'
}
}
});
为了完整起见,提供了整个初始化,但我不相信其中任何一个是相关的。
问题
当我检查我的子域时,如果我在空字段上模糊,它会正确突出显示该字段并在适当的 div 中显示“所需字段”错误。如果我输入一个字符并模糊,我会得到“最小长度”规则的正确行为。所以我可以相对确定 HTML 本身和高亮/错误行为是正确的。
但是当最终调用“远程” URL 时,行为并不像预期的那样。无论通过或失败,该字段都使用 突出显示".is-invalid"
,这也隐藏了反馈 div。无论其隐藏状态如何,".invalid-feedback"
div 也不会填充消息。
返回的 JSON 采用两种格式之一。第一个例子是失败,第二个是通过:
{
"subDomain":"SubDomain can't be only numeric"
}
或者
{
"subDomain":true
}
现在,文档对于远程选项来说不是很好,但我认为这是返回应该采用的形式。他们自己的链接示例似乎显示了这种签名。
如果我仍然不清楚:缺少的是当远程服务返回通行证时,该字段应该不突出显示。当它返回失败时,该字段应突出显示,并且服务传递的自定义消息应显示在错误字段中。
更新
我相信实际上是响应 JSON 搞砸了。如果我直接看验证源代码,它想看看是否response == true || response || response == "true"
为真部分。这很奇怪,因为它还记录了这一点:“服务器端响应必须是 JSON 字符串,对于有效元素必须是“true”,对于无效元素可以是“false”、未定义或 null”。
当然,没有键匹配的 JSON 字符串是不存在的,文档也没有说明键应该是什么。我通过查看他们示例页面的返回消息进行推断。所以现在我不确定响应应该是什么,或者他们的示例页面实际上是如何成功运行的。如果我的响应是“true”或“Some message”格式的 html/text,根本没有 JSON,我觉得它会“工作”。
更新 2:解决方案
如果有人偶然发现这一点,答案就在 Sparky 的评论中,并且与我在第一次更新中的怀疑相符:服务器端返回的响应格式不正确。
响应应该在应用程序/文本中,并且整个响应正文应该包含:
"true"
或者
"Some custom error message"
完成此操作后,一切正常。事实证明,文档也很好,但我被“JSON 格式的字符串”这个术语吓到了,这实际上只是意味着“正确地用双引号括起来,并且只有有效的字符”。我认为这意味着需要一个完整的 JSON 对象。
解决方案
为了更容易找到,这里的答案来自 Sparky 在原始问题中的评论:
响应应该在应用程序/文本中,并且整个响应正文应该包含:
"true"
或者
"Some custom error message"
双引号是必需的,它不应该是任何类型的完整 JSON 对象。完成此操作后,一切正常。事实证明,文档也很好,但我被“JSON 格式的字符串”这个术语吓到了,这实际上只是意味着“正确地用双引号括起来,并且只有有效的字符”。我认为这意味着需要一个完整的 JSON 对象。
我们的 Java 代码最终会进行内部验证,并且已经可以访问 HttpServletResponse 类。然后它只是基于 HttpServletResponse.getWriter() 创建一个 PrintWriter 并写入它:
PrintWriter out = null;
// ... later ...
// "response" was passed in as type HttpServletResponse
out = response.getWriter();
// out is just a buffer for what gets dumped into response body
out.println(resultingString);
out.flush();
out.close();
推荐阅读
- javascript - 从 React 中检索状态数据
- reactjs - 如何在反应路由器 v5 中监听路由变化?
- kubernetes - 什么是 kubernetes 守护程序集中的“可用”列
- java - Axon Framewok vs GDPR(从域事件条目表中删除物理个人数据)
- python - 取两个列同时增加的行
- c# - 为什么 Office 365 的 SMTP 身份验证在一个域中失败,而在另一个域中失败?
- ios - AADB2C 使用 Apple 登录并使用 Apple 私人电子邮件中继服务
- c# - 有没有办法知道一个人是否点击了 GPay 的“保存”按钮
- swift - DidSelectRowAt 方法中的混合顺序
- python - 在 Pygame Rect 中写入数字/文本