2009-06-10 47 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();