Javascript 两个Onclick函数,ajax/php或JS。先叫什么?

Javascript 两个Onclick函数,ajax/php或JS。先叫什么?,javascript,php,ajax,encryption,Javascript,Php,Ajax,Encryption,我有这个剧本: <script type="text/javascript" src="sha512.js"></script> <script type="text/javascript" src="forms.js"></script> <script> function loadXMLDoc(form, password) { var xmlhtt

我有这个剧本:

    <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>

函数loadXMLDoc(表单、密码)
{
var-xmlhttp;
if(window.XMLHttpRequest)
{//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
其他的
{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
formhash(表单、密码);
}
}
open(“POST”,“POST.php”,true);
xmlhttp.send();
}
这个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在密码加密之前检查密码是否为空。我想可能是在formhash函数的所有javascript都运行之后PHP才运行,这太晚了。我需要先运行“onclick”中的第一个函数,然后运行另一个函数。是我做错了什么,还是像我预料的那样

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

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


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

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

通过简单地将其放置在按钮的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);
...
为此,您需要使用
id
属性标识HTML中的
email
输入字段,如

...
Email: <input type="text" name="email" id="email" /><br />
...
。。。
电子邮件:
...
还有(尽管Stackoverflow这里并不真正需要这一点…)最后一点建议:使用“普通”JavaScript做任何事情都是可能的,但是如果您开始使用jQuery(“写得少,做得多”),您可以让自己的生活变得更轻松。

试试:

<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.
}

函数loadXMLDoc(frm,pass){
.....
.....
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
formhash(frm,pass);
}
.....
.....
}
函数formhash(frm,pass)
{
//这里是密码加密脚本。
}

是的,基本上就是这样!但您可能是指您的onclick事件调用
loadXMLDoc
而不是
formhash
?是的,您是对的,最好的观察结果是正确的。谢谢。我已经尝试将此添加到我的函数中,除了此处显示“//密码加密脚本”的位置之外。”其他一切都对吗?我必须把这个实际的脚本放在那里,然后删除我的form.js文件,它通常包含这个函数吗?如果form.js文件中已经有formhash(){//密码加密脚本,那么就不需要在这里添加formhash(){//密码加密脚本。}。它应该可以从你的文件中工作。所以它应该像现在一样工作?(编辑文章).我对JS了解不多,所以很难理解它是如何工作的。我尝试在ReadyStateChange中添加一个函数,这就是你的意思吗?我基本上是在暗示Salim在此期间写的东西:-)我仍在为此苦苦挣扎,我现在编辑了更多,我相信应该是这样的?这对我来说是有意义的至少,当我按下register按钮时,什么也没有发生,有什么想法吗?不要将
formhash
的函数定义放在
readystatechange
函数的成功部分,也就是说,省去
函数
这个词,并确保为函数调用提供有效的参数。