0

我有这个脚本:

    <script type="text/javascript" src="sha512.js"></script>
<script type="text/javascript" src="forms.js"></script>

<script>
            function loadXMLDoc(form, password) 
            {
            var xmlhttp;
            if (window.XMLHttpRequest)
              {// code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp=new XMLHttpRequest();
              }
            else
              {// code for IE6, IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
              }
            xmlhttp.onreadystatechange=function()
              {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
               {
                   document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                   formhash(form, password);
               }
              }
            xmlhttp.open("POST","post.php",true);
            xmlhttp.send();
            }
</script>

这个html:

    <div id="myDiv">
<form action="register.php" method="post">
   Email: <input type="text" name="email" /><br />
   Username: <input type="text" name="username" /><br />
   Password: <input type="password" name="p" id="password" /><br />
   <input type="button" value="Register" onclick="loadXMLDoc(this.form, this.form.password);" />
</form>
</div>

您可能已经注意到,一旦按下按钮,onclick 就会运行两个函数。第一个函数就是您在上面看到的那个,它是一个运行 ajax 的 JavaScript 代码,其中包含一些 PHP。另一个功能是 100 % Javascript,它对密码字段进行加密。

我的问题是,在使用 formhash 函数对密码进行加密之前,我无法让它运行 PHP。

我需要这个的原因是因为我需要 PHP 在密码加密之前检查密码是否为空。我想也许 PHP 会在 formhash 函数中的所有 javascript 运行后运行,这为时已晚。我需要先运行“onclick”中的第一个函数,然后再运行第二个。我做错了什么,还是如我所料?

编辑:哇,我有一个“{”太多了。现在我认为它可以工作了,但它不记得用户在表单中发布了什么。所以我不能做这样的事情:

<?php
    if (empty($_POST['email'])) {
            echo "<p>Test</p>";
        }
?>

因为它不再知道电子邮件。

4

2 回答 2

1

尝试:

<input type="button" value="Register" onclick="loadXMLDoc(this.form, this.form.password);" />

<script>
function loadXMLDoc(frm, pass) {
   .....
   .....
   if (xmlhttp.readyState==4 && xmlhttp.status==200)
   {
       document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

       formhash(frm, pass);
   }
   .....
   .....
}

function formhash(frm, pass)
{
    //password encryption script here.
}

于 2013-09-29T11:50:47.393 回答
1

如果您希望formhash在您的 Ajax 调用准备好之后调用该函数,那么您应该将该函数调用放入readystatechange您的 Ajax 调用的函数中。

通过简单地将其放在按钮的 onclick 事件中,在loadXMLDoc()调用之后您将无法达到预期的效果,因为 Ajax 函数是异步工作的('Ajax' 中的'A')......

编辑:

使用 Ajax,您需要显式发送表单数据,因为您没有将其作为表单操作的一部分提交:

...
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.onreadystatechange=function()
              {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
               {
                   document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                   formhash(form, password);
               }
              }
xmlhttp.open("POST","post.php",true);
xmlhttp.send('email='+documents.getElementById('email').value);
...

为此,您需要使用类似的属性识别emailHTML 中的输入字段id

...
Email: <input type="text" name="email" id="email" /><br />
...

并且(尽管在 Stackoverflow 上这并不是真正想要的……)最后一句建议:只用“普通”的 JavaScript 就可以完成所有事情,但是如果你开始工作,你可以让自己的生活变得更加轻松使用 jQuery(“少写,多做”)。

于 2013-09-29T11:45:52.267 回答