【发布时间】:2011-03-27 00:20:23
【问题描述】:
我问过一个较早的question,这肯定很有帮助,并让我知道了 JSONP。但是,我看到我必须将 JSONP 指定为数据类型。现在,据我所知,这是返回数据的返回类型,即 XML。可以使用 JSONP 返回 XML,还是仅限于以 JSONP 格式返回?谢谢!
【问题讨论】:
标签: javascript jquery xml jsonp
我问过一个较早的question,这肯定很有帮助,并让我知道了 JSONP。但是,我看到我必须将 JSONP 指定为数据类型。现在,据我所知,这是返回数据的返回类型,即 XML。可以使用 JSONP 返回 XML,还是仅限于以 JSONP 格式返回?谢谢!
【问题讨论】:
标签: javascript jquery xml jsonp
由于它的工作方式,您只能使用 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。
【讨论】:
这个想法是从服务器发回可执行代码。编写一个 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 尚未得到广泛支持。
【讨论】:
dataType 设置为jsonp xml,jQuery 确实支持xmlp。根据文档:“从 jQuery 1.5 开始,jQuery 可以将数据类型从它在 Content-Type 标头中收到的内容转换为您需要的内容。例如,如果您希望将文本响应视为 XML,请使用“文本 xml”对于数据类型。您还可以发出 JSONP 请求,将其作为文本接收,并由 jQuery 解释为 XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从 jsonp 转换为xml,如果失败,则从 jsonp 转换为文本,然后从文本转换为 xml。”
您可以在/* comment */ 内部的Javascript 函数中编写XML,并使用functionname.toString() 方法将此函数转换为文本并解析“/*”和“*/”之间的文本使用 JSONP 的 callback 函数,适用于所有旧浏览器。示例 xml_via_jsonp.js :
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);
}
【讨论】:
xml_string 完全跳过整个func.toString()。