我正在学习这些东西,所以我的代码可能不太漂亮......但是会感激一些帮助:)
我没有编写以下代码,但是从网上的其他地方获得了这些代码:
function text_xml()
{
realXmlUrl="http://jumac.com/del_me_fruits.xml";
http_request = false;
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{
http_request.overrideMimeType('text/xml');
}
http_request.onreadystatechange = this.response_xml;
http_request.open('GET', realXmlUrl, true);
http_request.send(null);
xmlDoc = http_request.responseXML;
}
function response_xml()
{
if (self.http_request.readyState == 4)
{
document.getElementById("ex").appendChild(document.createTextNode(" Done!"));
getFruits(http_request.responseText);
}
}
function getFruits(xml) {
var fruits = xml.getElementsByTagName("fruits")[0];
if (fruits) {
var fruitsNodes = fruits.childNodes;
if (fruitsNodes) {
for (var i = 0; i < fruitsNodes.length; i++) {
var name = fruitsNodes[i].getAttribute("name");
var colour = fruitsNodes[i].getAttribute("colour");
alert("Fruit " + name + " is coloured " + colour);
}
}
}
}
我得到的错误是:
Error: xml.getElementsByTagName is not a function
我做错了什么?
答案 0 :(得分:5)
responseText
是一个字符串,而不是XML。您在寻找responseXML
吗?
<强>更新强>
如果您的脚本是从与您正在加载的XML文档不同的域加载(http://jumac.com/del_me_fruits.xml),那么XMLHttpRequest将在浏览器上采取不同的处理方式。
在IE 8上,它会弹出一个警告窗口,抱怨“该页面正在访问不受其控制的信息。这会带来安全风险。你想继续吗?”如果你单击是,那么它将正常工作(即,将加载XML并显示水果的警报)。
但是,在Chrome 12上,它不会弹出任何内容,并且会说“XMLHttpRequest无法加载http://jumac.com/del_me_fruits.xml。Access-Control-Allow-Origin不允许原始http://localhost:54671。”由于此错误,请求对象的responseXML属性将为null,您将看到错误。
关于跨域XMLHttpRequest还有其他问题,您可以在其中找到解决问题的方法,例如Cross-site XMLHttpRequest和http://code.google.com/chrome/extensions/xhr.html。
<body>
<script type="text/javascript">
function text_xml() {
realXmlUrl = "http://jumac.com/del_me_fruits.xml";
http_request = false;
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
http_request.onreadystatechange = this.response_xml;
http_request.open('GET', realXmlUrl, true);
http_request.send(null);
xmlDoc = http_request.responseXML; // this doesn't have anything
}
function response_xml() {
if (self.http_request.readyState == 4) {
document.getElementById("ex").appendChild(document.createTextNode(" Done!"));
getFruits(http_request.responseXML);
}
}
function getFruits(xml) {
var fruits = xml.getElementsByTagName("fruits")[0];
if (fruits) {
var fruitsNodes = fruits.childNodes;
if (fruitsNodes) {
for (var i = 0; i < fruitsNodes.length; i++) {
var name = fruitsNodes[i].getAttribute("name");
var colour = fruitsNodes[i].getAttribute("colour");
alert("Fruit " + name + " is coloured " + colour);
}
}
}
}
</script>
<input type="button" value="Click me" onclick="text_xml();" />
<p><div id="ex"></div></p>
</body>
答案 1 :(得分:0)
在跨服务器传输数据时,我通常喜欢使用字典。
MkNxGn.pro提供了一种通过MkNxGn Proquest发出XML HTTP请求的简洁方法。
加载请求,可以与代码分开
<script src="https://mknxgn.pro/scripts/Proquest_Proquest-v1.0.js"></script>
<script>
Proquest("POST",
URL_HERE,
DATA,<br>
HEADERS,
RType,
Ignore JSON errors,
Callback);
</script>
这样,您可以轻松编写:
<script>
Proquest("GET", "http://jumac.com/del_me_fruits.xml", Skip, {'Content-type': 'text/xml'}, 'response', false, function(resp) {
resp.overrideMimeType('text/xml'); //Looks like you want it to be XML if its not.
document.getElementById("ex").appendChild(document.createTextNode(" Done!"));
getFruits(resp.responseXML);
});
</script>
忽略 jason的编辑以更好地重写它。
答案 2 :(得分:-1)
考虑使用像jquery这样的javascript库。
jquery ajax几乎是自我解释,你不必混淆浏览器兼容性。 http://jquery.com/