[英]Using JSONP when returning XML
由於它的工作原理,你只能使用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.