2009-06-10 46 views
20

首先,這不是設置頁面的理想方式,但是需要將腳本分配爲1個文件。Firefox錯誤'找不到元素'

我有一個PHP腳本在JavaScript的其他xhtml文檔的頂部,並在某些情況下使用XHR發送查詢字符串到頁面本身。然後,頂部的php會激活,並將傳遞的內容存儲爲會話,然後終止本身(exit())。 XHR是異步的,從不檢查它是否返回內容。

但是,在Firefox 3中,每次發送XHR請求時,錯誤控制檯都會引發錯誤no element found。另外,如果我使用諸如exit('Done')之類的出口,Firefox會拋出(完成)的語法錯誤,就好像它將其插入可見DOM中一樣。這在Opera中似乎不會發生。

有沒有更好的方法來存儲已經生成的xhtml頁面的會話?很明顯,我可以將XHR添加到另一個頁面,但我寧願將它全部保留在一個腳本中。 Firefox是否將XHR請求視爲DOM的更新?我不知道爲什麼它發送這個錯誤。


更新正如我所說的,Firefox中的XHR請求時僅thows錯誤。該頁面是有效的XHTML,並且完美地工作,除非XHR請求是針對頁面本身,否則不會出現錯誤。

我想知道爲什麼它發送錯誤,因爲它確實不會返回任何東西。

這裏是一個JavaScript片段,它可以從一個對象發出ajax請求。 它創建一個沒有回調函數的XHR對象,併發布信息。當不參考同一頁面時,它可以正常工作。

var saveState = { saveContent: function(updateActiveMenu) { 
    var sendState = new ajaxObject(gV.url); 
    if (!updateActiveMenu) { 
     var storageContainer = document.getElementById("StorageContainer").innerHTML; 
     var menu = document.getElementById("Nav").innerHTML; 
     sendState.update("Containerstring="+urlencode(storageContainer)+"&Nav="+urlencode(menu)+"&Active="+gV.activeMenuItem, 'POST', true); } }, } 

,而PHP的做到這一點

if (isset($_REQUEST['Containerstring']) && isset($_REQUEST['Nav']) && isset($_REQUEST['Active'])) { 
    $_SESSION['Containerarray'] = (saveContainer(regulateEscapes(urldecode($_REQUEST['Containerstring'])))); 
    $_SESSION['Navarray'] = (saveNav(regulateEscapes(urldecode($_REQUEST['Nav'])))); 
    $_SESSION['Active'] = $_REQUEST['Active']; 
    exit('Done'); 
} 

我也知道我不應該使用的innerHTML但這是另一個故事


的錯誤是這樣

Error: no element found 
Source File: http://localhost/ajax.php?1244648094055 
Line: 1 

請注意,錯誤,而在p我正在使用的hp頁面引用了一個永遠不會被調用的查詢字符串。

+0

您所描述的內容存在一些不一致之處。如果xhr從不使用返回值(即'完成'),那麼它不能將其插入到DOM中,現在可以嗎? – SilentGhost 2009-06-10 14:32:55

+0

甚至更​​好的發佈你的代碼的一個小例子。 – SilentGhost 2009-06-10 14:34:44

+0

爲什麼不把頁面源代碼的相關部分向上? – 2009-06-10 14:44:36

回答

25

Firefox期望獲得可以解析爲XML的內容,並在獲得空響應時拋出XML解析錯誤。

之前,你的PHP調用「退出()」,使用

header('Content-Type: text/plain'); 

和Firefox不會嘗試解析響應爲XML,並且應該沒有錯誤。

-2

你應該讓你的PHP返回一個有效的HTTP響應,因爲即使你沒有對它做任何事情,Firefox也會嘗試讀取它。因此,請至少返回一個有效標題

header("HTTP/1.0 200"); 
exit();