Javascript 为什么event.preventDefault()并不总是有效?

Javascript 为什么event.preventDefault()并不总是有效?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个通过ajax提交的表单。我必须在提交前检查输入字段值,但无论我做什么,表单都会不断提交,即使它没有通过测试。有人知道为什么会这样吗?如果您在下面看到我的代码,表单提交函数将检查这些值,如果不符合条件,则返回false。但是,由于某些原因,返回false或event.preventDefault()都不起作用。我不知道发生了什么事。也许我忽略了什么 function checkPass(){ var newPass = $("#newPass").val(); var c

我有一个通过ajax提交的表单。我必须在提交前检查输入字段值,但无论我做什么,表单都会不断提交,即使它没有通过测试。有人知道为什么会这样吗?如果您在下面看到我的代码,表单提交函数将检查这些值,如果不符合条件,则返回false。但是,由于某些原因,返回false或event.preventDefault()都不起作用。我不知道发生了什么事。也许我忽略了什么

function checkPass(){

    var newPass = $("#newPass").val();
    var confirmPass = $("#confirmPass").val();

    if(newPass != confirmPass || confirmPass == '') { 
        $( "#confirmDiv" ).addClass( "has-warning" );
        $( "#confirmError" ).addClass( "animated fadeInDown" );
        $( "#confirmError" ).addClass( "text-warning" );
        document.getElementById("confirmError").style.fontSize = '14px';
        document.getElementById("confirmError").innerHTML = "The passwords don't match.<br>";
        event.preventDefault();
        return false; 
    } else {
        $( "#confirmDiv" ).removeClass( "has-warning" );
        document.getElementById("confirmError").innerHTML = "";
        $( "#confirmError" ).removeClass( "animated fadeInDown" );
        return true; 
    }

}

function updatePassword(){

  checkPass();

  event.preventDefault();

  var url = "updatePassword.php";
  var form = $("#updatePassword");

  $.ajax({
    url: url,
    type: "POST",
    data: form.serialize(),
    success: function(a) {
      if (a == "Success!") {

         alert(a);

         document.getElementById('updatePassword').reset();

      } else {

         alert(a);

      }

    }
  });

}
函数checkPass(){
var newPass=$(“#newPass”).val();
var confirmPass=$(“#confirmPass”).val();
如果(newPass!=confirmPass | confirmPass==''){
$(“#confirmDiv”).addClass(“有警告”);
$(“#确认错误”).addClass(“动画fadeInDown”);
$(“#确认错误”).addClass(“文本警告”);
document.getElementById(“confirmError”).style.fontSize='14px';
document.getElementById(“confirmError”).innerHTML=“密码不匹配。
”; event.preventDefault(); 返回false; }否则{ $(“#confirmDiv”).removeClass(“has warning”); document.getElementById(“确认错误”).innerHTML=“”; $(“#确认错误”).removeClass(“动画fadeInDown”); 返回true; } } 函数updatePassword(){ checkPass(); event.preventDefault(); var url=“updatePassword.php”; 变量形式=$(“#更新密码”); $.ajax({ url:url, 类型:“POST”, 数据:form.serialize(), 成功:职能(a){ 如果(a==“成功!”){ 警报(a); document.getElementById('updatePassword').reset(); }否则{ 警报(a); } } }); }
您需要传递事件参数才能使用event.preventDefault(),顺便说一句,您使用的是
return false
,这应该可以防止。但是仔细查看您的代码,我发现了一个问题。您正在updatePassword和其他代码中调用checkPass

function updatePassword(){

  checkPass();
  // rest of the code still runs if checkPass returns false
因此,您需要在这里使用一个条件:

function updatePassword(){

  if(checkPass()) {
   // rest of the code
现在,您正确地阻止了这种行为。或者,如果要使用preventDefault(),可以通过在updatePassword中提供事件参数来修复代码


供您分析的测试用例:

功能测试(){
返回错误
}
函数test2(){
if(test())
console.log('test2')
}
函数test3(){
测试()
console.log('test3')
}
test2()

test3()
您好,我假设在onsubmit事件发生时,您正在调用“updatePassword()”方法,我认为您应该做一些这样的更改,它对我有效,我希望它对您有效

function updatePassword() {
        event.preventDefault();
        if (checkPass()) {

            var url = "updatePassword.php";
            var form = $("#updatePassword");

            $.ajax({
                url: url,
                type: "POST",
                data: form.serialize(),
                success: function (a) {
                    if (a == "Success!") {

                        alert(a);

                        document.getElementById('updatePassword').reset();

                    } else {

                        alert(a);

                    }

                }
            });
        }

    }

尝试显式传递
事件
,而不是依赖于全局定义它。
函数updatePassword(){
应该是函数
updatePassword(事件){
同样适用于
checkPass()
->checkPass(事件)`这些方法是如何调用的?错误是否特定于浏览器?将事件添加到my函数无效:/“您需要传递事件参数才能使用event.preventDefault(),”不幸的是…不是。在支持非标准window.event全局的浏览器中,您可以通过使用
window.event.preventDefault()很好地防止当前事件的默认行为
。在DOM2事件处理程序中返回false完全没有任何作用。您可能会与jQuery事件处理程序混淆。@Kaido我正在考虑元素中的方法绑定……嗯,我可能会混淆。没有这样的方法。(jQuery对象确实有它)