2010-08-08 58 views
13

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

回答

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> 

,你可以我magine,JavaScript解析器不会那么喜欢,并且不知道该如何处理它。 jQuery在大多数情况下可以毫不费力地解析XML,但是如果您使用的是JSONP并且它适用于跨域请求......那么JSONP是您唯一的选择,除非您在您的网站上编写了一个代理页面,它没有违反同源策略规则,并将其用作通过获取XML的代理。

+0

感谢您的帮助!如果我想使用JSONP将数据发布到API _without_,那么我可以将数据发布到API,而不必担心奇怪的跨域问题是否正确?感谢您的帮助,我是一个PHP的家伙和Javascript/jQuery对我来说还是很新的! 基本上我试图写一个小部件放在其他网站,所以我只限于Javascript,并且不能使用任何服务器端。再次感谢! – patricksweeney 2010-08-08 18:40:14

+1

@patricksweeney - 您可以发布是,但是您不会收到回复,它是*服务器的响应*,而不是POST * *您的浏览器阻止的服务器...... POST响应的内容会是空的,这就是每个主流浏览器中同源安全的原理。 – 2010-08-08 18:41:38

+1

所以基本上我应该看看我们是否可以用JSONP封装服务器响应或使用代理,对吧? – patricksweeney 2010-08-08 18:42:45

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没有广泛被支持。

+3

如果将'dataType'设置为'jsonp xml',jQuery确实支持xmlp。根据文档:“从jQuery 1.5开始,jQuery可以将ContentType类型头文件中的数据类型转换为您需要的数据类型,例如,如果您希望将文本响应视为XML,请使用”text xml“你也可以创建一个JSONP请求,将它作为文本接收,并由jQuery解释为XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的简写字符串将首先尝试从jsonp转换为xml,并且,如果没有,请从jsonp转换为文本,然后再从文本转换为xml。“ – 2011-12-29 21:26:09

+0

@ greg.kindel - 感谢您的信息。我会**尝试**来更新答案,但我现在感觉有点懒。 – Anurag 2011-12-29 23:03:53

-3

您可以在/* comment */里面用Javascript函数编写XML,并使用函数函数名将此函数转换为文本。toString()和解析“/*”和“*/”之间的文本与JSONP回调函数,适用于所有旧浏览器。示例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); 
} 
+2

这是一个可怕的想法。 – cpburnz 2015-02-19 19:29:37

+0

你有什么更好的主意? – Derozer 2015-02-19 22:46:12

+0

您可以简单地将XML存储在一个字符串中。改为用'xml_string'完全跳过整个'func.toString()'。 – cpburnz 2015-02-19 23:28:42