JSP表单仍然提交,即使JavaScript验证返回false

时间:2014-08-18 20:18:13

标签: javascript jquery jsp

我有一个带有“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;}
 };

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 您正在解雇ajax请求。默认情况下,Ajax请求是异步的。在调用$.get()之后,代码会立即前进到下一行,而异步请求则在后台运行完全不同的线程。因为在$.get()之后你的情况显然没有,它会立即返回(隐含地为true)。

  2. 您从回调函数返回,而不是从main函数返回。回调函数只返回主函数,而不是返回外部。您需要从主函数返回。

  3. 一种方法是始终返回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。