使用PHP和XML的Ajax,getElementsByTagName IE问题

时间:2009-08-03 21:11:32

标签: php javascript ajax

我在IE(7和8)中遇到了getElementsByTagName的问题。

我有一个地址查找,它将每个建议的地址(作为XML字符串)返回到PHP会话变量中,然后使用返回所请求的会话变量的AJAX函数进行访问。

每个会话变量都在ajax地址查找的第1步中设置(我尝试过没有字符编码和utf-8):

$_SESSION['addrHint_' . $k1] = '<?xml version="1.0" encoding="ISO-8859-1"?>';
$_SESSION['addrHint_' . $k1] .= '<Address>';
$_SESSION['addrHint_' . $k1] .= '<Postcode>' . $v1->Postcode . ' </Postcode>';
$_SESSION['addrHint_' . $k1] .= '<Line1>' . $v1->Line1 . ' </Line1>';
$_SESSION['addrHint_' . $k1] .= '<Line2>' . $v1->Line2 . ' </Line2>';
$_SESSION['addrHint_' . $k1] .= '<Line3>' . $v1->Line3 . ' </Line3>';
$_SESSION['addrHint_' . $k1] .= '</Address>';

然后在第2步中检索到:

header('Content-Type: text/xml');
print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

在AJAX js中,当状态准备就绪时,它会执行其他类似的代码行,这个:

var xmlDoc = xmlHttp.responseXML;
var xmlRoot = xmlDoc.documentElement;
var postcode = xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue;
document.forms[0]["address"+addr+"_Postcode"].value = postcode.substring(0, postcode.length-1);

(它对地址的每一行做了类似的事情。)长度为1的片段在那里,因为我必须在每个元素后面附加一个空格来阻止我在元素为空时遇到的问题。

它在Firefox中运行良好,但在IE中根本没有。从那以后我一直在谷歌搜索,并在前5页中找到了一些结果,但没有解决方案。如果有人能对此有所了解,我将非常感激。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可能应该在获取节点值的代码周围执行一些错误检查,而不是修改返回值。

如果进行大量链接,则无法检查空值。 而不是像这样链接:

xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue

为什么不在手前添加一些错误检查? 类似的东西:

var postCodes = xmlRoot.getElementsByTagName("Postcode");
if( postCodes && postCodes[0] && postCodes[0].childNodes[0] ) {
    document.forms[0]["address"+addr+"_Postcode"].value = postCodes[0].childNodes[0].childNodes[0].nodeValue;
}

这样,如果那里没有数据,你只会尝试分配。获得您期望的空白输入值。

现在,所有链接和if语句都会让人厌烦,所以如果你愿意,可以将它包装在一个函数中。

请在此处查看一个有效的示例:http://jsbin.com/ahidu

干杯!

答案 1 :(得分:0)

的print_r ???

print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

“$ SESSION ['addrHint '。$ _ REQUEST ['addr']]”不是数组。

答案 2 :(得分:0)

使用IE开发人员工具(IE8:内置,IE7:Developer Toolbar)来调试javascript。
您可能还想添加一些console debug code,例如追踪准备状态。
在服务器端设置php的error_reporting到E_ALL并密切注意webserver的error.log(php消息将显示在哪里)