我有一个表单提交页面,在表单提交时调用一个函数。根据ajax中的条件包含ajax.Form提交.Ajax msg有两个值1和0,一次一个值。我的要求是当msg == 1表格不提交而msg == 0提交表格时。但现在两种情况下表格都没有提交。
我的代码如下。任何人都可以提供解决方案吗?
主页
<form action="addCustomer_basic.php" method="post"
name="adFrm" id="myform" >
<input name="name" type="text"
class="txtfld" id="name"
value=">" style="width:250px;"/>
<input name="email" type="text"
class="txtfld" id="email" value="" style="width:250px;"/>
<input name="submit" type="submit" value="Submit" />
</form>
<script language="JavaScript">
$(function() {
$("#myform").submit(function(e) {
var $form = $(this);
var cust_name = $form.find('[name="name"]').val();
e.preventDefault();// prevent submission
var email = $form.find('[name="email"]').val();
$.ajax({
type: "POST",
url: 'ajx_customer_mailid.php',
data:'cust_name='+cust_name + '&email=' + email,
success: function(msg)
{
alert(msg);
if(msg==1)
{
alert("Email Id already excist in database");
return false;
}
else
{
self.submit();
}
}
});
});
});
</script>
ajx_customer_mailid.php
<?php
require_once("codelibrary/inc/variables.php");
require_once("codelibrary/inc/functions.php");
$cust_id=$_POST['cust_name'];
$email=$_POST['email'];
$se="select * from customer where name='$cust_id' and email='$email'";
$se2=mysql_query($se);
if($num>0)
{
echo $status=1;
}
else
{
echo $status=0;
}
?>
答案 0 :(得分:0)
我没有ajax你的代码,只是将msg直接设置为1或2。 查看我的代码,现在您可以模拟它:
$("#myform").submit(function(e) {
var $form = $(this);
e.preventDefault();// prevent submission
var msg = 2;
if (msg === 1) {
alert("Email Id already excist in database");
return false;
} else {
$form.submit(); //This causes Too much recursion
}
});
其中有一些错误。
所以,self.submit();
很糟糕:
TypeError: self.submit is not a function
self.submit();
您需要将其重写为$form.submit()
;
但在这种情况下,如果表单需要提交,您将在控制台中收到错误:
too much recursion
这是因为,如果成功,则会再次触发提交。但是,因为在之前的案例中它是成功的,它将再次成功,再次触发提交,等等。
<强>更新强>
让我们更清楚这里发生了什么。提交表单后,在致电e.preventDefault()
之后会阻止表单提交。当ajax需要提交表单时,它会触发submit()
,但是你阻止它提交,但是ajax条件会再次成立,所以你再次提交,并防止,这是一个inifinte循环,是什么导致了很多递归。
注意:强>
if($num>0)
$num
来自哪里?您的php文件中没有任何$num
。您也不会获取您的SQL查询行。
使用mysqli_*
或PDO
函数代替mysql_*
,因为它们已被弃用。
通过转义变量来避免sql注入。
所以你需要像这样使用:
$se = "select * from customer where name='$cust_id' and email='$email'";
$se2 = mysql_query($se);
$num = mysql_num_rows($se2); //NEED THIS!
if ($num > 0) {
echo $status = 1;
} else {
echo $status = 0;
}
但我建议使用它:
$se = "SELECT COUNT(*) AS cnt FROM customer WHERE name='".mysql_real_escape_string($cust_id)."' and email='".mysql_real_escape($email)."'";
$se2 = mysql_query($se);
$row = mysql_fetch_assoc($se2); //NEED THIS!
if ($row["cnt"] > 0) {
echo $status = 1;
} else {
echo $status = 0;
}
答案 1 :(得分:0)
当您的ajax调用完成时,提交处理程序已经完成,因此提交继续,您知道它是异步的,因此该函数进行ajax调用并继续执行。您可以执行类似这样的操作http://jsfiddle.net/x7r5jtmx/1/代码执行的操作是进行ajax调用,然后等待,直到ajax success
更新变量的值,更新值时,如果值为1 ,不需要做任何事情,因为我们已经从提交中停止了表单。如果值为0,则触发单击按钮以重新提交表单。您无法在提交处理程序中调用submit
,但可以触发单击按钮。你显然需要改变ajax调用,只需在你的成功中设置msg
。
var data = {
json: JSON.stringify({
msg: 0 //change to 1 to not submit the form
}),
delay: 1
}
var msg = null;
var echo = function() {
return $.ajax({
type: "POST",
url: "/echo/json/",
data: data,
cache: false,
success: function(json){
msg = json.msg;
}
});
};
$( "#myform" ).submit(function( event ) {
echo();
var inter = setInterval(function(){
console.log("waiting: " + msg);
if (msg != null){
clearInterval(inter);
}
if (msg == 0){
$( "#myform" ).off(); //unbind submit handler to avoid recursion
$( "#btnn" ).trigger("click"); //submit form
}
}, 200);
return false; //always return false, we'll submit inside the interval
});