event.preventDefault()在Mozilla或IE不工作(event.prevent

2019-07-18 15:02发布

我终于在其他浏览器中测试我的网站的点(建它主要是在Chrome)。 不幸的是,很多东西似乎具有不同的功能。 我会与第一个问题开始:在登录时,我有一个JS / jQuery的检查,以确保用户名和密码匹配,并在失败时,应立即停止提交。

然而,尽管它在Chrome和Safari浏览器,在Mozilla和IE提交仍然通过去(打道歉页面,但仍然是我宁愿只是没有看到在所有)。

我已经试过了底层event.preventDefault()用于e.preventDefault()evt.preventDefault()但他们没有工作,形式仍然提交(和后两个这使得它,让它在Chrome提交以及)。 这里是我的代码,会喜欢什么感想:

function checkLogin()
{
    // get the variables, execute some other checks (eg, things not blank)

    // run ajax code to determine if pieces match
    $.ajax({
    type: "POST",
    url: "check_login.php", 
    data: {'username': username, 'password': password},
    async: false,
    success: function(result) 
    {
      if (result == 1)
      {
        $('#loginoff').html("Invalid username/password");
        e.preventDefault();
        return false;
      } 
      else
      {
        $('#loginoff').html("");
        return true;
      } 
    }
    });
}

请注意,该功能肯定会通过,并返回1当用户名和密码不匹配的,在所有情况下,“无效的用户名/密码”消息来了。

此外,如果有人有兴趣的HTML:

<form action="login.php" method="post" onsubmit="return checkLogin()">
<!-- code for inputs, eg username -->
<input type="submit" class="btn" value="Log In"/>
</form>

Answer 1:

我建议预防开始与该事件,那么当你希望表单提交,这样做与本地提交的方法,因为它绕过jQuery的。

var form = document.getElementById("formid");
$(form).submit(function(e){
    e.preventDefault();

    $.ajax({
        type: "POST",
        url: "check_login.php",
        data: {
            'username': username,
            'password': password
        },
        //async: false,
        success: function (result) {
            if (result == 1) {
                $('#loginoff').html("Invalid username/password");
            } else {
                $('#loginoff').html("");
                form.submit(); // note, form is a form NODE, not a jQuery object containing a form.
            }
        }
    });

});

这也让您免去async: false (比webworkers内除外)这始终是一个好东西



Answer 2:

设置控制台来持久的console.log。 你应该看到一个JavaScript错误

e.preventDefault();  //<--trying to prevent the form from submitting

哪里是e定义?

function checkLogin()  <-- No e defined

您将有一个错误,这意味着因为没有从停止阻止它的形式将提交。

function checkLogin(e) {
    e = e || window.event;

而且,因为它不是一个jQuery封包的事件对象,你需要做的像

$.Event(e).preventDefault();


Answer 3:

除了其他人所说的AJAX问题,IE8不会做的preventDefault()。

的preventDefault替代的IE8

(event.preventDefault) ? event.preventDefault() : event.returnValue = false; 


Answer 4:

不幸的是我不能这样做,因为我在标题所希望的那样我从来没有成功地阻止在所有四个浏览器提交(Mozilla的是一个持久的抵抗)。

我最终什么事做,那么,是以下几点:

1)在我的HTML,我改变的边界,使其只包含了投入,但“提交”按钮,在外面的

2)然后,而不是有一个像我,我感动“返回checkLogin()”下调至提交按钮(即现在的形式之外),并把它改成的“onClick”。

3)通过这种方式,我不需要任何的preventDefault(),因为没有默认发生。 我只是去了Ajax请求,并在“返回true”的情况下,将其设置到$(“#的MainForm”)提交();

注:通过这样做,我也能够使Ajax请求不再异步,这大家都说好(我还新,因此没有确定它的重要性)。

希望这有助于任何人谁在同样的问题来了。



Answer 5:

我终于想通了,如何使它在一般的工作:

在部分功能应该写成:

请注意,“事件”作为checkLogin输入

然后我用的功能如下。 主要的变化是一个。)防止默认提交在开始(注意,$ .Event(e)是必要的,否则它不会在IE浏览器),B)定义使用的getElementById形式,C)提交功能使用form.submit()。 希望人们有所帮助。

function checkLogin(e)
{
var form = document.getElementById("mainloginform");
$.Event(e).preventDefault();

// set error counter
var counter = 0;
var username = $('#loginusername').val();
var password = $('#loginpassword').val();

// check that username is not blank
 if (username==null || username=="")
{
    $('#usernameoff').html("Must enter your username");
    counter++;
}
else
{
    $('#usernameoff').html("");
}

// check that password is not blank
 if (password==null || password=="")
{
    $('#passwordoff').html("Must enter your password");
    counter++;
}
else
{
    $('#passwordoff').html("");
}

// if counter zero at this point, return false, else return true
if (counter > 0)
{
    return false;
}
else
{
    $.post("check_login.php", {'username': username, 'password': password}, function(result)
    {
        if(result == 1)
        {
            $('#loginoff').html("Invalid username/password");
            return false;
        }
        else
        {
            $('#loginoff').html("");
            form.submit();
            return true;
        }
    });
}
}


文章来源: event.preventDefault() not working in Mozilla or IE