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