我有一个带有“deleteCont”形式的JSP和一个带有“validateDelete”函数的javascript文件。当我单击“删除联系人”按钮时,“validateDelete”功能被成功调用,并显示带有“alertmessage”的警报。但是,即使返回false,仍会调用“ContactMaint”servlet。请有人能告诉我哪里出错了吗?
<form name="deleteCont"
onsubmit="return validateDelete('${sessionScope.account}','${sessionScope.firstname}', '${sessionScope.lastname}')"
action="ContactMaint" method="post">
<input type="submit" value="Delete contact" name="delContact">
</form>
function validateDelete(account, contactFirstName, contactLastName) {
urlstrg = "http://localhost:8080/SalesPoliticalMapping/JCheckContacts?account=" +
account + "&firstname=" + contactFirstName + "&lastname=" + contactLastName;
$.get(urlstrg, function (result, status) {
if (result.length > 0) {
var alertmessage = "Can't delect contact:";
for (var i = 0; i < result.length; i++) {
alertmessage += result[i];
}
alert(alertmessage);
return false;
}
});
}
我现在修改了我的代码如下,虽然我不完全确定原因:
function validateDelete(account, contactFirstName, contactLastName) {
$.ajaxSetup({async: false});
urlstrg = "http://localhost:8080/SalesPoliticalMapping/JCheckContacts?account=" + account + "&firstname=" + contactFirstName + "&lastname=" + contactLastName;
var valid = true;
var alertmessage = "";
$.get(urlstrg, function(result, status) {
if (result.length > 0) {
valid = false;
alertmessage = "Can't delect contact:";
for (var i = 0; i < result.length; i++) {
alertmessage += result[i];
}
}
});
if (valid===false) {
alert(alertmessage);
return false;}
};
答案 0 :(得分:2)
有两个问题:
您正在解雇ajax请求。默认情况下,Ajax请求是异步的。在调用$.get()
之后,代码会立即前进到下一行,而异步请求则在后台运行完全不同的线程。因为在$.get()
之后你的情况显然没有,它会立即返回(隐含地为true
)。
您从回调函数返回,而不是从main函数返回。回调函数只返回主函数,而不是返回外部。您需要从主函数返回。
一种方法是始终返回false并在成功时明确提交表单。
function validateDelete(...) {
var $form = $(this);
$.get(..., function(...) {
if (success) {
$form.submit();
}
});
return false;
}
另一种方法是通过将{ async: false }
选项作为$.get()
的第二个参数传递来使ajax请求异步。
function validateDelete(...) {
var valid = false;
$.get(..., { async: true }, function(...) {
if (success) {
valid = true;
}
});
return valid;
}
请注意,此问题与JSP完全无关。在其他视图技术(如PHP,ASP等)中使用相同的脚本时,甚至在纯HTML页面中,您仍然遇到完全相同的问题。 JSP在这个问题的上下文中只是一个HTML代码生成器,在未来的问题中可以更好地省略HTML + CSS + JS / jQuery。