YUI3 PR1試用 - Cross Domain Request
Sat, 08 Nov 2008 23:59:45 +0800YUI3的IO模組除了有XMLHttpRequest的功能外,還可以利用模組裡面的io.swf來做出cross domain request,突破XMLHttpRequest無法跨domain的限制。
其實flash的cross domain request還是有限制的,就是伺服器上必須有一個crossdomain.xml,描述可以接受request的domain。像這樣:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="a.b.c" /> <allow-access-from domain="d.e.f" /> </cross-domain-policy>
這樣就可以接受a.b.c與d.e.f網站送出的request。如果要讓所有網站都可以對伺服器發出request,就:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>
接下來寫一個簡單的網頁,擷取blog上面的rss,然後秀出title list(還是用YUI3網站上的tutorial改的):
<html> <script src="build/yui/yui-min.js"></script> <body> <input type="button" value="test" id="test"> <div id="panel"></div> <script> YUI().use('io', function(Y) { var xdrConfig = { id: 'flash', yid: Y.id, src: 'build/io/io.swf' }; Y.io.transport(xdrConfig); var cfg = { method: 'GET', xdr: { use: 'flash', responseXML: true }, on: { success: function(id, o, a) { Y.get('#panel').set('innerHTML',''); try { var parser = new DOMParser(); var xmldoc = parser.parseFromString(o.responseText, 'text/xml').documentElement; }catch(e){ try { var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); xmldoc.async="false"; xmldoc.loadXML(o.responseText); }catch(e){alert(e);} } var objs = xmldoc.getElementsByTagName('title'); var str = ""; str += "<ul>"; for (var i=0; i<objs.length; i++) { str += "<li>" + objs[i].firstChild.nodeValue + "</li>"; } str += "</ul>"; Y.get('#panel').set('innerHTML', str); }, failure: function(id, o, a) { Y.get('#panel').set('innerHTML','Failed...'); }, start: function(id, a) { Y.get('#panel').set('innerHTML', 'Starting...'); }, abort: function(id, a) { Y.get('#panel').set('innerHTML','Aborted...'); } } }; Y.on('io:xdrReady', function() { Y.get('#test').on('click', function(e) { var obj = Y.io( "http://blog.fillano.idv.tw/rss.php?blogId=1&profile=rss20", cfg ); }); }); }); </script> </body> </html>
比較麻煩的是,xdr只能回傳responseText,所以必須想辦法把responseText解析成DOM物件,這樣程式才容易處理,在IE需要用到Microsoft.XMLDOM這個activeX物件,在firefox/mozilla則可利用DOMParser物件。(不過這幾個方法可能不適用於其他瀏覽器...究竟不是標準方法)
io模組的使用比較不那麼直覺,首先要用Y.io.transport(xdrconfig)來設定xdr的一些基本參數。使用時,先組好一個request config物件,然後傳給Y.io(config),這時request就會發動,而事件處理函數也會照指定的發動。
下面的連結是自己寫的例子,內容跟上面的程式碼一樣:
http://www.fillano.idv.tw/test344.html