【问题标题】:Issues with an interaction between ajax and php?ajax 和 php 之间的交互问题?
【发布时间】:2012-09-26 04:59:57
【问题描述】:

我正在开发一个表单,它通过 post 将多个用户输入提交到数据库并由 php 处理。为此,我使用了 ajax(我知道 jquery 有时更容易,但我更愿意先掌握 ajax)。

但是,它不能正常工作 - 即它根本不能工作。我知道当表单没有通过 ajax 传递时,php 文件可以正常工作。

这就是我现在所拥有的——表单本身:

<table border="0" cellpadding="2" cellspacing="5">
                <th colspan="2" align="center">Check Out</th>
                <form name="checkOut" method="post" onSubmit="return(validate(this))" action=""> 
                    <tr><td>Territory Number</td><td><input type="text" name="numberOut" tabindex="1" maxlength="3" size="3" /></td>
                    </tr><tr><td>First Name of Publisher</td><td><input type="text" onKeyUp="showHint(this.value)" name="fName" tabindex="2" maxlength="15"/></td>
                    </tr><tr><td>Last Name of Publisher</td><td><input type="text" onKeyUp="showHint_l(this.value)" name="lName" tabindex="3" maxlength="15" /></td>
                    </tr><tr><td><input type ="checkbox" name="specialC" tabindex="4" value="Yes"/> Special Campaign</td>
                    </tr><tr><td><input type="button" onClick="clearForm()" value="Reset" /></td><td><input type="submit" value="Check Out" /></td>
                </form>
                <p>Suggestions: <span id="txtHint"></span></p>
            </table>

javascript/ajax 处理函数:

<script type="text/javascript">
        function validate(form)
        {
            fail = validateTerrNum(document.checkOut.numberOut.value);
            fail += validateFirstName(document.checkOut.fName.value);
            fail += validateLastName(document.checkOut.lName.value);
            if (fail == "")
            {
                //Begin preparing values for submission to server
                var params = "numberOut="+document.getElementsByName("numberOut")[0].value;
                    params+="?fName="+document.getElementsByName("fName")[0].value;
                    params+="?lName="+document.getElementsByName("lName")[0].value;
                var isSc = document.getelementsByName("specialC")[0].checked;
                if(isSc)
                {
                    params+="?specialC=Yes";
                }

                //Send those values to the server
                checkOut(params);
                return true;            
            }           
            else 
            {
                alert(fail);
                return false;
            }
        }
    </script>

最后是通过 post 的 ajax 函数:

function checkOut(params)
{
var urlString = params;
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("test").innerHTML=xmlhttp.responseText; 
    }
}
//Setup for post submission 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.open("POST","checkOut.php",true);
xmlhttp.send(urlString);
}

我怀疑我没有正确提交发布请求。我已经让其他 ajax 函数正确地使用此表单,但它是通过 get - 我确实想使用 post,因为它正在更改数据库中的数据。

如果有人对此有所了解,将不胜感激。

编辑:带有通用按钮的新表单:

<table border="0" cellpadding="2" cellspacing="5">
                <th colspan="2" align="center">Check Out</th>
                <form name="checkOut" method="post" action=""> 
                    <tr><td>Territory Number</td><td><input type="text" name="numberOut" tabindex="1" maxlength="3" size="3" /></td>
                    </tr><tr><td>First Name of Publisher</td><td><input type="text" onKeyUp="showHint(this.value)" name="fName" tabindex="2" maxlength="15"/></td>
                    </tr><tr><td>Last Name of Publisher</td><td><input type="text" onKeyUp="showHint_l(this.value)" name="lName" tabindex="3" maxlength="15" /></td>
                    </tr><tr><td><input type ="checkbox" name="specialC" tabindex="4" value="Yes"/> Special Campaign</td>
                    </tr><tr><td><input type="button" onClick="clearForm()" value="Reset" /></td><td><input type="button" onClick="return(validate(this))" value="Check Out"/></td>
                </form>
                <p>Suggestions: <span id="txtHint"></span></p>
            </table>

【问题讨论】:

    标签: javascript html ajax forms post


    【解决方案1】:

    如果您通过 ajax 发布数据,则必须取消表单提交,否则表单将提交,这可能会取消您的 ajax 请求。

    您还必须在拨打open 后拨打setRequestHeader

    【讨论】:

    • 你能再详细点吗,我不太明白你在说什么?您是说不是提交表单,而是使用可用输入创建一个触发功能的按钮?
    • @Mlagma 如果您单击表单上的提交按钮,表单将提交,加载一个新页面,该页面将取消在前一页面上执行的任何操作,例如阿贾克斯。因此,如果您通过 ajax 发布数据,您应该阻止表单本身发布。
    • 有道理。所以即使没有表单提交,javascript 仍然能够通过 DOM 获取值?不过除此之外,功能看起来还不错?
    • @Mlagma 是的,您可以使用 javascript 在不提交表单的情况下获取表单字段的值。
    • 我刚刚尝试将它从提交切换到通用按钮;还是不行。
    猜你喜欢
    • 2012-10-25
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2016-11-11
    • 2016-05-15
    相关资源
    最近更新 更多