我在XHTML,PHP和JavaScript之间徘徊了一段时间。我的目的是让用户从表单菜单中选择一个选项,并使用单独的PHP页面的内容更新DIV的innerHTML。例如,选择“Cat”会调用“animaloptions.php?species = cat”,其结果将被抛入DIV块。但是,如果我通过PHP的Content-Type
函数指定调用页面的Header
,那么我的代码就会失败。
以下是我的JavaScript代码:
function showOptions(str) {
if (str == "") {
document.getElementById("mainArea").innerHTML = "";
return;
}
xmlhttp = new XMLHttpRequest();
if (xmlhttp) {
xmlhttp.open("GET", "animaloptions.php", true);
xmlhttp.setRequestHeader("Content-Type", "application/xhtml+xml; charset=utf-8");
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("mainArea").innerHTML = xmlhttp.responseText;
}
else {
document.getElementById("mainArea").innerHTML = "Loading…";
}
}
xmlhttp.send("species=" + str);
}
}
如果我在调用它的页面中不包含以下PHP代码,则此代码有效:
header('Content-Type: application/xhtml+xml; charset=utf-8');
这样做会阻止responseText加载,大概是因为readyState,status或两者都与我指定的值不匹配。如果我不检查那些条件,那么responseText就是未定义的。
我的猜测是要求PHP发送原始HTTP标头将阻止我的XMLHttpRequest按预期运行。问题是我需要发送这个原始头,因为Web服务器没有自己将页面标识为UTF-8(谢谢你,未命名的Web主机),并且因为我的Web主机,所以包括标准<?xml version=1.0 encoding=utf-8 ?>
是不可能的在PHP中打开短标签。 (是的,我尝试使用echo
将其打入页面,但PHP由于某种原因自动将其转换为注释行,这是一个单独的问题。)
我是否只是滥用XMLHttpRequest对象?有没有切实可行的方法呢?
修改
我应该明确指出“不工作”的含义。在Safari的开发工具中,我看到animaloptions.php作为资源添加,其代码由PHP处理,但其内容不会添加到DIV块(或任何块)。如果是,那么我将不再将此页面视为单独的资源。如果我在JavaScript代码中使用responseText,则浏览器会抛出DOM错误12(指定了无效或非法的字符串)。如果我使用responseXML,那么我没有错误,也没有文本,但是animaloptions.php在资源下显示的都是相同的。