有没有办法只使用JavaScript从另一个域加载XML文件?

5
jQuery有一个$.getJSON()函数,我用它来从其他域加载json文件,如下所示:
$.getJSON('http://somesite.com/file.js', function(output) {
   // do stuff with the json data
});

我想知道是否可以使用其他域的xml文件进行相同的操作,还是必须使用服务器端语言来实现?
这是我想要加载的xml文档:

http://google.com/complete/search?output=toolbar&q=microsoft


如果你所说的 JavaScript 是指在浏览器中运行的客户端 JavaScript,那么不,由于同源策略的限制,这是不可能的。同源策略是浏览器内置的一种机制,旨在防止恰好像这样的情况发生。 - Darin Dimitrov
3个回答

2

我同意@viyancs的观点,简单来说,如果你想获取其他域的xml,会受到跨域限制,解决这个问题的方法是创建代理。请求流程如下:

1. 使用 $.ajax 请求你的代理(真实的 xml 地址)。

2. 代理检索 xml 地址内容。

3. 代理将内容返回给你的 $.ajax 调用。

更多细节请参见:http://developer.yahoo.com/javascript/howto-proxy.html

顺便说一下:为什么对于JSON不需要这样做?这是一种技术叫做JSONP


0

你可以尝试这个

$.ajax({
   type: "GET", 
   dataType: "xml", 
   url:"localhost/grab.php", 
   success: function(){
    //to do when success
   }
 });

1)将服务作为代理从 URL 获取内容 例如在 grab.php 代码中:

<?php
   $url = 'http://google.com/complete/search?output=toolbar&q=microsoft';
   $parsing = parse_url($url);
   $scheme =  $parsing[scheme];
   $baseurl = basename($url);
   $strbase =$baseurl;
   $finalUri = $scheme .'://' .$strbase;
   $handle = fopen($finalUri, "r",true);
    // If there is something, read and return
 if ($handle) {
  while (!feof($handle)) {
   $buffer = fgets($handle, 4096);
   echo $buffer;
  }
  fclose($handle);
 }

?>


你的回答似乎太复杂了,为什么他需要创建一个服务?你的 PHP 代码似乎没有给他任何新信息? - James.Xu
我使用grab.php来解决跨域问题,因为如果执行'$ .ajax({type:“GET”,dataType:“xml”,url:“http://google.com/complete/search?output=toolbar&q=microsoft”,success:function(){ //成功时要执行的操作} });',响应会被禁止。我只是提供了一个解决方案,因为我曾经遇到过同样的问题,这对我很有效。谢谢。 - viyancs
哦,我明白了,你正在使用自己的服务器作为代理。也许清楚地说明问题和解决方案比具体的代码更好--这只是我的意见 :) - James.Xu
没错,我会更新代码让它更好。谢谢你的关注。:) - viyancs

0

如果你真的没有使用带有缓存的代理的能力(这是适当的礼仪),你可以使用类似 YQL 作为 JSONP 代理服务 的东西。但是,如果没有 API 密钥,最终会达到限制。

// query: select * from xml where url='http://google.com/complete/search?output=toolbar&q=microsoft'
var xml_url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fgoogle.com%2Fcomplete%2Fsearch%3Foutput%3Dtoolbar%26q%3Dmicrosoft'&diagnostics=true"
$.get(xml_url,function(xml){ console.log(xml); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接