Javascript 使用Ajax提交表单

Javascript 使用Ajax提交表单,javascript,ajax,Javascript,Ajax,我需要使用Ajax和POST方法提交表单。代码如下: function persistPage(divID,url,method){ var scriptId = "inlineScript_" + divID; var xmlRequest = getXMLHttpRequest(); xmlRequest.open("POST",url,true); xmlRequest.onreadystatechange = function(){ ale

我需要使用Ajax和POST方法提交表单。代码如下:

function persistPage(divID,url,method){ 
    var scriptId = "inlineScript_" + divID;
    var xmlRequest = getXMLHttpRequest();   
    xmlRequest.open("POST",url,true);
    xmlRequest.onreadystatechange = function(){
    alert(xmlRequest.readyState + " :" + xmlRequest.status);
    if (xmlRequest.readyState ==4 || xmlRequest.status == 200)
          document.getElementById(divID).innerHTML=xmlRequest.responseText;
    };
    xmlRequest.open("POST", url, false);
    alert(xmlRequest.readyState);
    xmlRequest.send(null);
}
但是表单没有提交(请求没有执行或没有数据发布)。如何使用Ajax提交表单


谢谢

此代码可以让您理解。函数SendRequest通过GetXMLHttpRequest函数发送请求并构建xmlRequest

function SendRequest() {
    var xmlRequest = GetXMLHttpRequest(),
    if(xmlRequest) {

        xmlRequest.open("POST", '/urlToPost', true)

        xmlRequest.setRequestHeader("connection", "close");
        xmlRequest.onreadystatechange = function() {
            if (xmlRequest.status == 200) {
                // Success          
            }
            else {
                // Some errors occured                  
            }               
        };

        xmlRequest.send(null);
    }
}

function GetXMLHttpRequest() {
    if (navigator.userAgent.indexOf("MSIE") != (-1)) {
        var theClass = "Msxml2.XMLHTTP";
            if (navigator.appVersion.indexOf("MSIE 5.5") != (-1)) {
            theClass = "Microsoft.XMLHTTP";
        }
        try {
            objectXMLHTTP = new ActivexObject(theClass);
            return objectXMLHTTP;
        }
        catch (e) {
            alert("Errore: the Activex will not be executed!");
        }
    }
    else if (navigator.userAgent.indexOf("Mozilla") != (-1)) {
        objectXMLHTTP = new XMLHttpRequest();
        return objectXMLHTTP;
    }
    else {
        alert("!Browser not supported!");
    }
}

此代码可以让您理解。函数SendRequest通过GetXMLHttpRequest函数发送请求并构建xmlRequest

function SendRequest() {
    var xmlRequest = GetXMLHttpRequest(),
    if(xmlRequest) {

        xmlRequest.open("POST", '/urlToPost', true)

        xmlRequest.setRequestHeader("connection", "close");
        xmlRequest.onreadystatechange = function() {
            if (xmlRequest.status == 200) {
                // Success          
            }
            else {
                // Some errors occured                  
            }               
        };

        xmlRequest.send(null);
    }
}

function GetXMLHttpRequest() {
    if (navigator.userAgent.indexOf("MSIE") != (-1)) {
        var theClass = "Msxml2.XMLHTTP";
            if (navigator.appVersion.indexOf("MSIE 5.5") != (-1)) {
            theClass = "Microsoft.XMLHTTP";
        }
        try {
            objectXMLHTTP = new ActivexObject(theClass);
            return objectXMLHTTP;
        }
        catch (e) {
            alert("Errore: the Activex will not be executed!");
        }
    }
    else if (navigator.userAgent.indexOf("Mozilla") != (-1)) {
        objectXMLHTTP = new XMLHttpRequest();
        return objectXMLHTTP;
    }
    else {
        alert("!Browser not supported!");
    }
}
请看第页。在这行:
req.send(postData)发布数据是一个数组,其中包含应发布到服务器的值。你有空。所以没有发布任何内容。您只需调用请求,不发送任何数据。在您的情况下,您必须从表单中收集所有值,因为XMLHTTPRequest并不能简单地提交表单。必须使用JS传递所有值:

   var postData = {};
   postData.value1 = document.getElementById("value1id").value;
   ...
   xmlRequest.send(postData);
其中
value1
将在服务器上可用,如$\u POST['value'](PHP)

此外,URL或如何调用
persistPage
也可能有问题。persistPage代码在我看来还可以,但可能我遗漏了什么。如果控制台中没有错误,也可以查看一下。在任何浏览器中按F12键并查找console选项卡。在FF中,您可能需要安装Firebug扩展。此外,您将有一个包含所有请求的网络选项卡。在调用persistPage后,打开Firebug/Web Inspector(Chrome)/开发者工具栏(IE),检查新请求是否已在其网络选项卡中注册。

查看页面。在这行:
req.send(postData)发布数据是一个数组,其中包含应发布到服务器的值。你有空。所以没有发布任何内容。您只需调用请求,不发送任何数据。在您的情况下,您必须从表单中收集所有值,因为XMLHTTPRequest并不能简单地提交表单。必须使用JS传递所有值:

   var postData = {};
   postData.value1 = document.getElementById("value1id").value;
   ...
   xmlRequest.send(postData);
其中
value1
将在服务器上可用,如$\u POST['value'](PHP)


此外,URL或如何调用
persistPage
也可能有问题。persistPage代码在我看来还可以,但可能我遗漏了什么。如果控制台中没有错误,也可以查看一下。在任何浏览器中按F12键并查找console选项卡。在FF中,您可能需要安装Firebug扩展。此外,您将有一个包含所有请求的网络选项卡。打开Firebug/Web Inspector(Chrome)/Developer工具栏(IE),在调用persistPage后检查新请求是否已在其网络选项卡中注册。

代码无法工作的原因有几个。请允许我将其分解,并逐一讨论这些问题。我将从最后一个(但最大的)问题开始:

我的猜测是,您的代码基于一个
GET
示例,其中send方法是使用
null
调用的,甚至是
undefined
作为参数(
xhr.send()
)。这是因为url包含GET请求中的数据(
.php?param1=val1¶m2=val2…
)。使用post时,必须将数据传递给send方法

但我们不要超越自己:

function persistPage(divID,url,method)
{   
    var scriptId = "inlineScript_" + divID;
    var xmlRequest = getXMLHttpRequest();//be advised, older IE's don't support this
    xmlRequest.open("POST",url,true);
    //Set additional headers:
    xmlRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//marks ajax request
    xmlRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencode');//sending form
两个标题中的第一个并不总是必要的,但在我看来,安全总比抱歉好。现在,继续:

    xmlRequest.onreadystatechange = function()
    {
        alert(xmlRequest.readyState + " :" + xmlRequest.status);
        if (xmlRequest.readyState ==4 || xmlRequest.status == 200)
            document.getElementById(divID).innerHTML=xmlRequest.responseText;
    };
此代码有许多问题。您正在为对象分配一个方法,因此无需使用
xmlRequest
引用您的对象,尽管在这里技术上有效,但一旦您将回调函数移到
persistPage
函数之外,这将断开。
xmlRequest
变量是函数作用域的局部变量,不能在函数作用域之外访问。此外,正如我前面所说的,这是一种方法:
这个
直接指向对象
如果
语句也有点奇怪:
readystate
必须是4、status==200,而不是or。因此:

    xmlRequest.onreadystatechange = function()
    {
        alert(this.readyState + " :" + this.status);
        if (this.readyState === 4 && this.status === 200)
        {
            document.getElementById(divID).innerHTML=this.responseText;
        }
    };
    xmlRequest.open("POST", url, false);
    alert(xmlRequest.readyState);//pointless --> ajax is async, so it will alert 0, I think
    xmlRequest.send(data);//<-- data goes here
}
只是为了好玩:这段代码未经测试,但应该可以正常工作。但是,在每次请求时,
persistPage
将创建一个新函数对象,并将其分配给
xmlRequest
onreadystate
事件。您可以编写此代码,这样您只需要创建一个函数。我现在不想讨论我钟爱的闭包(我想你已经准备好了),但重要的是要知道函数是对象,并且具有属性,就像其他所有东西一样:
替换:

    xmlRequest.onreadystatechange = function()
    {
        alert(this.readyState + " :" + this.status);
        if (this.readyState === 4 && this.status === 200)
        {
            document.getElementById(divID).innerHTML=this.responseText;
        }
    };
为此:

//inside persistPage function:
xmlRequest.onreadystatechange = formSubmitSuccess;
formSubmitSuccess.divID = divID;//<== assign property to function
//global scope
function formSubmitSuccess()
{
    if (this.readyState === 4 && this.status === 200)
    {
        console.log(this.responseText);
        document.getElementById(formSubmitSuccess.divID).innerHTML = this.responseText;
        //^^ uses property, set in persistPAge function
    }
}
//在persistPage函数中:
xmlRequest.onreadystatechange=FormSubmitAccess;

formSubmitSuccess.divID=divID// 代码不起作用有几个原因。请允许我将其分解,并逐一讨论这些问题。我将从最后一个(但最大的)问题开始:

我的猜测是,您的代码基于一个
GET
示例,其中send方法是使用
null
调用的,甚至是
undefined
作为参数(
xhr.send()
)。这是因为url包含GET请求中的数据(
.php?param1=val1¶m2=val2…
)。使用post时,必须将数据传递给send方法

但我们不要超越自己:

function persistPage(divID,url,method)
{   
    var scriptId = "inlineScript_" + divID;
    var xmlRequest = getXMLHttpRequest();//be advised, older IE's don't support this
    xmlRequest.open("POST",url,true);
    //Set additional headers:
    xmlRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//marks ajax request
    xmlRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencode');//sending form
两个标题中的第一个并不总是必要的,但在我看来,安全总比抱歉好。现在,继续:

    xmlRequest.onreadystatechange = function()
    {
        alert(xmlRequest.readyState + " :" + xmlRequest.status);
        if (xmlRequest.readyState ==4 || xmlRequest.status == 200)
            document.getElementById(divID).innerHTML=xmlRequest.responseText;
    };
此代码有许多问题。您正在为对象分配一个方法,因此无需使用
xmlRequest
引用您的对象,尽管在这里技术上有效,但一旦您将回调函数移到
persistPage
函数之外,这将断开。
xmlRequest
变量是函数作用域的局部变量,不能在函数作用域之外访问。此外,正如我前面所说的,这是一种方法:
这个
直接指向对象
如果
语句也有点奇怪:
readystate
必须是4、status==200,而不是or。因此:

    xmlRequest.onreadystatechange = function()
    {
        alert(this.readyState + " :" + this.status);
        if (this.readyState === 4 && this.status === 200)
        {
            document.getElementById(divID).innerHTML=this.responseText;
        }
    };
    xmlRequest.open("POST", url, false);
    alert(xmlRequest.readyState);//pointless --> ajax is async, so it will alert 0, I think
    xmlRequest.send(data);//<-- data goes here
}
只是为了好玩:此代码未经测试,bu