返回XML时使用JSONP
我问了一个早期的问题 ,这个问题肯定有用,让我知道JSONP。 但是,我发现我必须指定JSONP作为数据类型。 现在,据我所知,这是返回的数据的返回类型,即XML。 可以使用JSONP返回XML,还是仅限于以JSONP格式返回? 谢谢!
由于它的工作原理,你只能使用JSONP(而不是XML)。 JSONP变成了这个:
因此,当您获取内容时,它实际上是这样做的:
回来的是实际运行的JavaScript,所以它不能是XML,你会得到各种语法错误,就像你这样做:
可以想象,JavaScript解析器不会那么喜欢它,并且不知道如何处理它。 jQuery可以在大多数情况下解析XML而不会有任何麻烦,但是如果你正在使用JSONP并且它用于跨域请求......那么JSONP是你唯一的选择,除非你在你的站点上写了一个没有违反的代理页面同源策略规则,并将其用作通过获取XML的代理。
我们的想法是从服务器发回可执行代码。 编写jQuery插件或扩展ajax函数以将XML字符串作为函数参数返回。
myCallback(" John Doe ")
该插件将此字符串解析为XML并将其返回到您的实际回调。 就你的回调而言,它不知道string -> xml
转换过程。
这是一个现有的实现 。
使用jQuery最理想的接口是,
$.ajax({ url: 'http://example.com/resource?type=xml', dataType: 'xmlp', success: function(xml) { .. } });
但是因为搞乱并重写jQuery.ajax
是有问题的,你可以把它写成一个单独的命名空间插件本身,它将使用下面的getScript
。
$.myNamespace.ajax({ .. });
为此,您需要控制服务器。 服务器必须知道请求XML,并使用包含XML字符串作为参数的函数调用进行响应。 假设您发送到远程服务器的回调名称为foo
,则服务器必须响应以下内容:
foo(".. ")
我想如果您使用的是支持E4X的浏览器,那么就不需要将XML包装在字符串中。 服务器可以简单地将XML作为参数返回给回调函数:
foo( John Doe )
但不幸的是,E4X尚未获得广泛支持。
您可以在/* comment */
中的Javascript函数中编写XML,并使用方法functionname.toString()将此函数转换为文本,并使用JSONP的回调函数解析“ /*
”和“ */
”之间的文本,该函数可用于所有旧浏览器。 示例xml_via_jsonp.js :
function myfunc() {/* Random1 - Random2 Random3 */} function callback(func) { var myhtml = func.toString(); var htmlstart = myhtml.indexOf('/*'); var htmlend = myhtml.lastIndexOf('*/'); return myhtml.substr(htmlstart+2, htmlend-htmlstart-2); }