簡體   English   中英

返回XML時使用JSONP

[英]Using JSONP when returning XML

我問了一個早期的問題 ,這個問題肯定有用,讓我知道JSONP。 但是,我發現我必須指定JSONP作為數據類型。 現在,據我所知,這是返回的數據的返回類型,即XML。 可以使用JSONP返回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轉換過程。

這是一個現有的實現

使用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尚未獲得廣泛支持。

您可以在/* comment */中的Javascript函數中編寫XML,並使用方法functionname.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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM