返回XML时使用JSONP

时间:2010-08-08 18:09:53

标签: javascript jquery xml jsonp

我问了一个早期的question,这肯定是有帮助的,让我知道JSONP。但是,我发现我必须指定JSONP作为数据类型。现在,据我所知,这是返回的数据的返回类型,即XML。可以使用JSONP返回XML,还是仅限于以JSONP格式返回?谢谢!

3 个答案:

答案 0 :(得分:13)

由于它的工作原理,你只能使用JSONP(而不是XML)。 JSONP变成了这个:

<script src="myPage?callback=myFunction" type="text/javscript">

因此,当您获取内容时,有效地执行此操作:

<script type="text/javascript">
  myFunction({ data: value, data2: value2 });
</script>

回来的是实际运行的JavaScript,因此它不能是XML,你会得到各种语法错误,完全就像你这样做:

<script type="text/javascript">
  <elem>
    <data>value</data>
    <data2>value2</data2>
  </elem>
</script>

可以想象,JavaScript解析器不会那么喜欢它,也不知道如何处理它。 jQuery可以在大多数情况下解析XML而不会有任何麻烦,但是如果你正在使用JSONP而且它是用于跨域请求......那么JSONP是你唯一的选择,除非你在你的网站上写了一个没有违反的代理页面同源策略规则,并将其用作通过提取XML的代理。

答案 1 :(得分:2)

这个想法是从服务器发回可执行代码。编写jQuery插件或扩展ajax函数以将XML字符串作为函数参数返回。

myCallback("
  <root>
    <person>
      <first>John</first>
      <last>Doe</last>
    </person>
  </root>")

该插件会将此字符串解析为XML并将其返回到您的实际回调。就您的回调而言,它不知道string -> xml转换过程。

这是现有的implementation

使用jQuery的最理想的接口是,

$.ajax({
    url: 'http://example.com/resource?type=xml',
    dataType: 'xmlp',
    success: function(xml) { .. }
});

但是因为搞乱并重写jQuery.ajax是有问题的,你可以把它写成一个单独的命名空间插件本身,它将使用下面的getScript

$.myNamespace.ajax({
    ..
});

为此,您需要控制服务器。服务器必须知道请求XML,并使用包含XML字符串作为参数的函数调用进行响应。假设您发送到远程服务器的回调名称是foo,服务器必须回复以下内容:

foo("<names><name>..</name></names>")

我认为如果您使用的是支持E4X的浏览器,那么就不需要将XML包装在字符串中。服务器可以简单地将XML作为参数返回给回调函数:

foo(
  <names>
    <name>John Doe</name>
  </names>
)

但遗憾的是,E4X尚未获得广泛支持。

答案 2 :(得分:-3)

您可以在/* comment */内的Javascript函数中编写XML,并使用方法 functionname.toString()将此函数转换为文本,并在“/*”和“*/”之间解析文本function myfunc() {/* <xml> <div class="container"> <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel"> <div class="panel-heading">Random1 - Random2</div> <div class="panel-body"> <div>Random3</div> </div> </div> </div> </xml> */} function callback(func) { var myhtml = func.toString(); var htmlstart = myhtml.indexOf('/*'); var htmlend = myhtml.lastIndexOf('*/'); return myhtml.substr(htmlstart+2, htmlend-htmlstart-2); } “使用 JSONP 回调功能,适用于所有旧浏览器。示例 xml_via_jsonp.js

{{1}}