2012-09-11 75 views
0

提交我需要提交使用Ajax與POST method.The代碼的形式如下,形式使用Ajax

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提交表單。

謝謝

+0

爲什麼不使用jquery? http://api.jquery.com/jQuery.ajax/ –

+2

@Bondye - 假設有人知道基礎知識會更好。瞭解XMLHTTPRequest時,他會更好地理解jQuery Ajax。至於我 - 建議對新手使用jquery是個壞主意。 user1321824 - 你爲什麼認爲它沒有發佈?請求未執行或未發佈數據? –

+0

@FAngel:完全不同意:沒有jQuery標籤,沒有jQuery ...純JS知識是一件美妙的事情。許多jQ狂熱分子會更好地理解JS如何工作 –

回答

0

此代碼可以讓你理解。功能sendRequest將通過GetXMLHttpRequest功能

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!"); 
    } 
} 
0

看看this頁面發送請求並建立xmlRequest。在這一行中:req.send(postData);發佈數據是一個數組,其值應發佈到服務器。你在那裏沒有。所以沒有發佈。您只需調用請求併發送任何數據。在你的情況下,你必須從你的表單中收集所有的值,因爲XMLHTTPRequest不能簡單地提交表單。你必須通過所有的值與JS:

var postData = {}; 
    postData.value1 = document.getElementById("value1id").value; 
    ... 
    xmlRequest.send(postData); 

value1將可以像$ _ POST [「值」](在PHP)服務器

也有可能與URL有問題,或者您是如何呼籲persistPage。 persistPage代碼對我來說看起來不錯,但也許我錯過了一些東西。如果您在控制檯中沒有錯誤,也可以看看。在任何瀏覽器中按F12並找到控制檯選項卡。在FF中,您可能需要安裝Firebug擴展。此外,你會有網絡選項卡與所有請求。打開Firebug/Web Inspector(Chrome)/ Developer Toolbar(IE),然後在調用persistPage後,檢查是否在其網絡選項卡中註冊了新請求。

4

您的代碼無法正常工作的原因有幾個。請允許我將其分解並逐一解決問題。我會用最後(但最大的)的問題開始的:

xmlRequest.send(null); 

我的猜測是,你根據你的代碼上GET例如,在send方法被調用null,甚至undefined作爲參數(xhr.send())。這是因爲url包含GET請求中的數據(.php?param1=val1&param2=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 

前兩個頭部的並不總是必要的,但它是更好的安全比遺憾,IMO。現在,繼續:

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

此代碼有一些問題。您正在爲一個對象分配一個方法,因此不需要使用xmlRequest來引用您的對象,雖然在技術上有效,但在將函數移動到persistPage之外時,將會中斷。 xmlRequest變量對於函數的作用域是局部的,不能在其外部訪問。此外,正如我之前所說,這是一個方法:this指向的對象直接
if說法是有點不可思議,太:在readystate必須是4,狀態== 200,而不是或。所以:

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 
} 

你如何填寫的數據是你的,但要確保格式的標題匹配:在這種情況下'content type','x-www-form-urlencode'。因爲我當時正在拋棄jQ而贊成純JS,但它是可用的,你可能會選擇一兩件事。特別仔細看看function ajax()的定義。在這裏面,你會看到一個X瀏覽器的方式來創建一個XHR對象,並有一個函數在那裏字符串化的形式,也


無意義UPDATE:

只是爲了完整性起見,我將添加一個完整的示例:

function getXhr() 
{ 
    try 
    { 
     return XMLHttpRequest(); 
    } 
    catch (error) 
    { 
     try 
     { 
      return new ActiveXObject('Msxml2.XMLHTTP'); 
     } 
     catch(error) 
     { 
      try 
      { 
       return new ActiveXObject('Microsoft.XMLHTTP'); 
      } 
      catch(error) 
      { 
       //throw new Error('no Ajax support?'); 
          alert('You have a hopelessly outdated browser'); 
          location.href = 'http://www.mozilla.org/en-US/firefox/'; 
      } 
     } 
    } 
} 
function formalizeObject(form) 
{//we'll use this to create our send-data 
    recursion = recursion || false; 
    if (typeof form !== 'object') 
    { 
     throw new Error('no object provided'); 
    } 
    var ret = ''; 
    form = form.elements || form;//double check for elements node-list 
    for (var i=0;i<form.length;i++) 
    { 
     if (form[i].type === 'checkbox' || form[i].type === 'radio') 
     { 
      if (form[i].checked) 
      { 
       ret += (ret.length ? '&' : '') + form[i].name + '=' + form[i].value; 
      } 
      continue; 
     } 
     ret += (ret.length ? '&' : '') + form[i].name +'='+ form[i].value; 
    } 
    return encodeURI(ret); 
} 

function persistPage(divID,url,method) 
{ 
    var scriptId = "inlineScript_" + divID; 
    var xmlRequest = getXhr(); 
    xmlRequest.open("POST",url,true); 
    xmlRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
    xmlRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencode'); 
    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); 
    xmlRequest.send(formalizeObject(document.getElementById('formId').elements)); 
} 

只是爲了好玩:此代碼未經測試,但應該工作好。但是,每次請求persistPage都會創建一個新的函數對象,並將其分配給onreadystate事件xmlRequest。你可以編寫這段代碼,這樣你只需要創建1個函數。我現在不打算進入我心愛的封閉體系(我認爲你對此有足夠的理解),但重要的是要知道函數是對象,並且具有屬性,就像其他所有內容一樣:
替換:

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

不過不要用這個,因爲當你重新分配財產異步調用仍然可以運行,造成混亂。如果id總是一樣的話,你可以(但是關閉會更好)。

好吧,我會在那

+0

聖牛,你太棒了。感謝您的出色解釋! –

0

離開它,我發現你已經調用

xmlRequest.open()

方法兩次,一個與異步PARAM爲真另一個是假的。你打算做什麼?

xmlRequest.open("POST", url, true); 
... 
xmlRequest.open("POST", url, false); 

如果你想發送異步請求,請將參數傳遞爲true。 並且還使用「POST」的方法,你最好把請求頭埃利亞斯的建議,

xmlRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencode'); 

否則,你仍然可以得到意想不到的問題。

如果你想有一個同步的請求,其實你可以處理響應您直接發送後立即請求,就像:

xmlRequest.open("POST", url, false); 
xmlRequest.send(postData); 
// handle response here 
document.getElementById(scriptId).innerHTML = xmlRequest.responseText; 

希望這有助於。