您的代碼無法正常工作的原因有幾個。請允許我將其分解並逐一解決問題。我會用最後(但最大的)的問題開始的:
xmlRequest.send(null);
我的猜測是,你根據你的代碼上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
前兩個頭部的並不總是必要的,但它是更好的安全比遺憾,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總是一樣的話,你可以(但是關閉會更好)。
好吧,我會在那
爲什麼不使用jquery? http://api.jquery.com/jQuery.ajax/ –
@Bondye - 假設有人知道基礎知識會更好。瞭解XMLHTTPRequest時,他會更好地理解jQuery Ajax。至於我 - 建議對新手使用jquery是個壞主意。 user1321824 - 你爲什麼認爲它沒有發佈?請求未執行或未發佈數據? –
@FAngel:完全不同意:沒有jQuery標籤,沒有jQuery ...純JS知識是一件美妙的事情。許多jQ狂熱分子會更好地理解JS如何工作 –