event.preventDefault()在Mozilla或IE中无效

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

然而,虽然它适用于Chrome和Safari,但在Mozilla和IE中,提交仍在进行中(打到道歉页面,但仍然是我根本看不到的东西)。

我已经尝试为e.preventDefault()evt.preventDefault() e.preventDefault() event.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; } } }); } 

请注意,当用户名和密码不匹配时,该function肯定会通过并返回1,因为在所有情况下,都会出现“无效的用户名/密码”消息。

此外,如果有人对HTML感兴趣:

 

我建议阻止事件开始,然后当您希望表单提交时,使用本机提交方法执行它,因为它绕过了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之外)。

将控制台设置为持久化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(); 

除了别人提到的ajax问题外,IE8不做preventDefault()。

IE8的PreventDefault替代方案

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

不幸的是,我无法按照我在标题中所希望的那样做,因为我无法在所有四个浏览器中成功阻止提交(Mozilla是一个持久的坚持)。

那么我最终做的是以下内容:

1.)在我的HTML中,我改变了它的边界,使它只包含输入,但是’Submit’按钮是OUTSIDE的

2.)然后,我没有像我一样,将“check checkLogin()”移动到提交按钮(现在在表单之外)并将其更改为“onclick”。

3.)这样,我不需要任何preventDefault(),因为没有默认发生。 我只是去了ajax请求,在’return true’的情况下,将它设置为$(’#mainform’)。submit();

注意:通过这样做,我也能够使ajax请求不再异步,每个人都说是好的(我还是新的,所以不确定它的重要性)。

希望这有助于遇到同一问题的任何人。

我最终想出了如何使它一般工作:

在该部分中,该函数应写为:

请注意’event’作为checkLogin的输入

然后我使用的function如下。 关键更改是a。)在开始时阻止默认提交(注意,$ .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; } }); } }