Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回XML时使用JSONP_Javascript_Jquery_Xml_Jsonp - Fatal编程技术网

Javascript 返回XML时使用JSONP

Javascript 返回XML时使用JSONP,javascript,jquery,xml,jsonp,Javascript,Jquery,Xml,Jsonp,我在早些时候问了一个非常有用的问题,并让我了解了JSONP。但是,我发现我必须将JSONP指定为数据类型。现在,据我所知,这是返回的数据的返回类型,即XML。XML可以使用JSONP返回,还是仅限于以JSONP格式返回?谢谢 由于它的工作方式,您只能使用JSONP(而不是XML)。JSONP变成这样: <script src="myPage?callback=myFunction" type="text/javscript"> 因此,当你获取内容时,它有效地做到了这一点: &l

我在早些时候问了一个非常有用的问题,并让我了解了JSONP。但是,我发现我必须将JSONP指定为数据类型。现在,据我所知,这是返回的数据的返回类型,即XML。XML可以使用JSONP返回,还是仅限于以JSONP格式返回?谢谢

由于它的工作方式,您只能使用JSONP(而不是XML)。JSONP变成这样:

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

因此,当你获取内容时,它有效地做到了这一点:

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

myFunction({data:value,data2:value2});
返回的是实际运行的JavaScript,因此它不可能是XML,您将得到各种语法错误,就像您这样做:

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

价值
价值2

可以想象,JavaScript解析器不会非常喜欢它,也不知道如何处理它。jQuery在大多数情况下都可以毫无困难地解析XML,但是如果您使用JSONP并且它用于跨域请求……那么JSONP是您唯一的选择,除非您在站点上编写了一个不违反同源策略规则的代理页,并将其用作代理来获取XML。

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

myCallback("
  <root>
    <person>
      <first>John</first>
      <last>Doe</last>
    </person>
  </root>")
但是,由于混淆视听和重写
jQuery.ajax
是有问题的,所以您可以将其作为一个单独的名称空间插件来编写,它将在下面使用
getScript

$.myNamespace.ajax({
    ..
});
要使其工作,您需要控制服务器。服务器必须知道请求了XML,并使用包含XML字符串作为参数的函数调用进行响应。假设您发送到远程服务器的回调名称是
foo
,服务器将必须响应如下内容:

foo("<names><name>..</name></names>")
foo(“…”)
我认为如果您使用的浏览器支持E4X,那么就不需要将XML封装在字符串中。服务器可以简单地将XML作为参数返回回调函数:

foo(
  <names>
    <name>John Doe</name>
  </names>
)
foo(
无名氏
)

但不幸的是,E4X还没有得到广泛的支持。

您可以在
/*comment*/
中的Javascript函数中编写XML,并使用functionname.toString()方法将此函数转换为文本,并使用JSONP的回调函数解析“
/*/
”和“
*/
”之间的文本,这适用于所有旧浏览器。示例xml\u通过_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);
}
函数myfunc()
{/*
随机1-随机2
随机数3
*/}
函数回调(func)
{
var myhtml=func.toString();
var htmlstart=myhtml.indexOf('/*');
var htmlend=myhtml.lastIndexOf('*/');
返回myhtml.substr(htmlstart+2,htmlend-htmlstart-2);
}

谢谢您的帮助!如果我想在不使用JSONP的情况下将数据发布到API,我可以将数据发布到API,而不必担心奇怪的跨域内容,对吗?谢谢你的帮助,我是一个php爱好者,Javascript/jQuery对我来说还是很新的!基本上,我正试图编写一个小部件放在其他网站上,所以我仅限于Javascript,不能在服务器端使用任何东西。再次感谢@patricksweeney-你可以发布是的,但是你不会得到回复,这是来自服务器的回复,而不是浏览器阻止的服务器的帖子…帖子回复的内容将是空的,这就是同源安全在每个主要浏览器中的工作方式。因此,基本上我应该看看我们是否可以用JSONP包装服务器响应或使用代理,对吗?@patricksweeney-正确,这里有两个最好的解决方案:)我试图通过json获取NexTrip API,但它返回了一个XML文件。我疯了吗?如果将
dataType
设置为
jsonpxml
,jQuery确实支持xmlp。根据文档:“从jQuery 1.5开始,jQuery可以将一个数据类型从它在内容类型头中接收到的数据类型转换为您所需要的数据类型。例如,如果您希望文本响应被视为XML,请使用“文本XML”作为数据类型。您还可以发出JSONP请求,将其作为文本接收,并由jQuery解释为XML:“JSONP文本XML”。类似地,像“jsonpxml”这样的速记字符串将首先尝试从jsonp转换为xml,如果转换失败,将从jsonp转换为文本,然后从文本转换为xml。“@greg.kindel-谢谢你提供的信息。我会尝试更新答案,但我现在感觉有点懒。这是个糟糕的主意。你有什么更好的主意?你可以简单地将XML存储在字符串中。使用
xml\u string
完全跳过整个
func.toString()
。您必须在所有引号中添加斜杠,并使xml变得难以读取。理想情况下,您可以生成xml服务器端,将其序列化,将其编码为JSON字符串,返回给客户端,然后客户端反序列化JSON字符串,然后是XML字符串。