1

我想停止通过 ajax 请求的结果提交的表单...这是我尝试使用的代码:函数 chreg() 应该返回从 ajax 请求给出的布尔值,但它没有!

Javascript:

function chreg() {

user = document.getElementById('nome').value;
passw1 = document.getElementById('passw1').value;
passw2 = document.getElementById('passw2').value;
mai = document.getElementById('mail').value;
dat = 'use='+encodeURIComponent(user)+'&pas='+encodeURIComponent(passw1)+'&pas2='+encodeURIComponent(passw2)+'&mail='+encodeURIComponent(mai);

htp = new XMLHttpRequest;
htp.onreadystatechange = function(){

    if (htp.readyState == 4 && htp.status == 200){
        if (htp.responseText == "true"){
            alert('true');
        return true;
        }
        else {
        document.getElementById('er2').innerHTML = '<br/><h3>'+tag_esc(decodeURIComponent(htp.responseText))+'</h3>';
        return false;
        }


    }
};
a = Math.random
  htp.open("POST","checklog.php?a="+a,true);
  htp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    htp.send(dat);   
}

和 HTML:

<form action="reg.php" method="POST" onsubmit="return chreg(this);">
<table id="tab2"><tr><td>

<label for="user1">Username: <input type="text" name="user" id="nome" /></label></td>      <td>
<label for="mail">Indirizzo e-mail: <input type="text" name="mail" id="mail" /></label>   </td>
</tr>
<tr><td><label for="pass1">Password: <input type="password" name="pass1" id="passw1" />    </label></td>
    <td><label for="pass2">Password (conferma): <input type="password" name="pass2"  id="passw2" /></label></td></tr>
     <tr><td colspan="2"><br /><input type="submit" class="st" value="Registrati" /></td>    </tr>

</table>
<div id="er2"></div>
</form>

但它不起作用!帮助 非常感谢!

4

3 回答 3

1

您的成功处理程序函数返回 true 或 false,但您的 mainchreg方法不返回。

您需要在chreg方法中返回 false 以停止表单提交。

    [...]
    htp.send(dat); 
    return false;

由于您正在通过 ajax 处理表单提交,因此您可能根本不希望表单进行回发。

于 2012-04-15T19:03:59.307 回答
1

您将无法使其按原样工作,因为默认情况下AJAX 是异步的。这意味着您的方法在请求完成并且其结果为人所知之前立即chreg发起请求并返回。这是一个问题,因为您无法在结果已知之前返回,因为您需要该结果才能知道要返回什么。chreg

一种解决方案是通过在此处更改第三个参数来使请求同步:

// you will not need to set onreadystatechange at all

htp.open("POST","checklog.php?a="+a,false); // false = synchronous
htp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
htp.send(dat);   
if (htp.responseText == "true"){
    alert('true');
    return true;
}
else {
    document.getElementById('er2').innerHTML = '<br/><h3>'+tag_esc(decodeURIComponent(htp.responseText))+'</h3>';
    return false;
}

这不是最好的解决方案,因为它最终可能会在请求期间锁定 UI,这是不可取的。但是,回到异步模型(没有这个问题)会涉及更多,因为它需要你“向后”做一些事情:

  1. 调用函数chreg并发出 AJAX 请求;它总是返回false(所以表单没有提交)
  2. onreadystatechanged您安装的处理程序检测到 AJAX 已完成时,它会检查响应。
  3. 如果响应在逻辑上是正确的(实际上需要提交表单),则使用form.submit它来完成。
于 2012-04-15T19:08:55.180 回答
0
<!DOCTYPE html>
<html>
<body>

<h1>My First JavaScript</h1>

<p>Please input a number.</p>

<input id="demo" type="text">

<script>
function myFunction()
{
var x=document.getElementById("demo").value;
if(x==""||isNaN(x))
        {
        alert("Not Numeric");
        }
}
</script>
于 2013-10-22T10:48:51.793 回答