我目前是webdevlopment部门的初学者(也是针对糟糕的问题格式提前使用stackoverflow ..srry)。基本上,我遇到了onsubmit事件的问题,该事件没有从函数中获取返回值被叫......功能是:
function checkUnique1() {
var ok = true;
socket.emit('eCheck', {email: document.getElementsByName("email")[0].value});
socket.on('eValidateMessage', function(obj) {
if(obj.message == false)
{
document.getElementsByName("email")[0].style.borderColor = "#E34234";
document.getElementById("emailExist").innerHTML = "Email has not been registered";
document.getElementById("emailExist").style.color = "#E34234";
ok = false;
}
});
return ok;}
我正在使用此函数来检查数据库中是否存在电子邮件。如果它存在,则函数应该返回true,而onsubmit应该触发,否则它将返回false并且onsubmit不会触发,并且表单不会被提交..我的表格是:
<form class="form-horizontal" action="/forgotPass" onsubmit="return checkUnique1()" method="post" id="formid">
<div class="form-group">
<label class="control-label col-sm-4"><h1>Creators Space</h1></label>
<div class="col-sm-8">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2"></label>
<div class="col-sm-10">
<label class="control-label">Please enter the email registered with Creators Space</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="email">Email:</label>
<div class="col-sm-6">
<input type="email" class="form-control" name="email" onclick="emailRSet()" onkeypress="emailRSet()" placeholder="Enter email" required title="email (format: xx@xx.xx/xx@xx.xx.xx)" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$">
<span id="emailExist"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary" value="submit">Submit</button>
</div>
</div>
现在,当所有上述代码都在html文件中时,这种方法很有效,但是当我在手柄模板中执行相同的操作时,函数似乎没有返回任何值,因此在两种情况下都提交了表单。 如何在车把模板中做同样的事情???可能是什么问题?
如果您需要更多信息,请与我们联系
答案 0 :(得分:0)
socket.on(function)
上的函数可能是异步执行的(也就是说,不是马上,但将来的某个时间),所以当return ok
执行时,socket.on(function)
上的函数没有已执行,因此ok
仍具有true
的价值。
也许下面的内容可行:
function checkUnique1() {
// make sure only the submit button of that form matches this selector
var submitButton = document.querySelector("form.form-horizontal button[value='submit']");
var typedEmail = document.getElementsByName("email")[0].value;
// disable the submit button upon click to prevent multiple submits
submitButton.disabled = true;
if (window.validatedEmail === typedEmail) {
// email has been validated, submit form
return true;
} else {
// email has not been validated, request validation
socket.emit('eCheck', {email: document.getElementsByName("email")[0].value});
socket.on('eValidateMessage', function(obj) {
if(obj.message == false)
{
document.getElementsByName("email")[0].style.borderColor = "#E34234";
document.getElementById("emailExist").innerHTML = "Email has not been registered";
document.getElementById("emailExist").style.color = "#E34234";
// re-enables the submit button, since the email was not validated
submitButton.disabled = false;
// clears validatedEmail (since validation failed, no email has been validated)
window.validatedEmail = null;
}
else {
// 'marks' the typed e-mail as validated
window.validatedEmail = typedEmail;
// make sure only that form matches this selector
document.querySelector("form.form-horizontal").submit();
}
});
return false;
}
}
上面的代码创建了一个全局变量window.validatedEmail
,其中包含最后一封已经过验证的电子邮件。
链接一个演示小提琴进行调试: https://jsfiddle.net/acdcjunior/3v52u69u/2/ (它的答案有一些变化,因为我无法访问您的websocket,我使用了另一个,所以我不得不做一些调整。)
每条评论:
if (window.validatedEmail === typedEmail)
part..likewindow.validatedEmail
做什么,为什么要检查它是否等于typedEmail
?
当表单提交时,代码会检查是否存在(全局)变量window.validatedEmail
,如果存在,则检查是否等于键入的电子邮件(typedEmail
)。
首次提交表单时,if
将为false
,因为没有window.validatedEmail
。现在,当if
为false
时,我们会转到else
部分。 else
部分只对websocket(socket.emit
)发出验证请求,并注册一个在验证响应时将执行的侦听器函数(socket.on('eValidateMessage', function(obj) { ... }
)。
当验证响应并执行function(obj) { ... }
时,它会执行以下操作:如果验证消息告诉我们电子邮件未经过验证(即obj.message == false
),则会添加错误消息并启用提交按钮,以便用户在更改电子邮件后再次按下该按钮。
现在,另一方面,如果验证消息告诉我们电子邮件 已经过验证(else
if
部分内function(obj) { ... }
}),然后我们在全局变量typedEmail
中保存window.validatedEmail
(我们知道刚刚验证过)并重新提交表单。
这一次,当表单重新提交时,它会像往常一样首先检查全局变量window.validatedEmail
是否存在以及它是否等于typedEmail
。现在的不同之处在于window.validatedEmail
会存在 - 因为我们已将其保存在else
的{{1}}部分。
由于它存在且等于function(obj) { ... }
,因此我们只需typedEmail
,即可提交表单。