2007年7月2日 星期一

如何用javascript執行不同網域的script

因為XSS的安全性問題,所以不能使用XMLHttpRequest的抓不同網域的資料,這限制了部份mashup的發展,不過經過測試,加上Ajax Patterns的佐證,發現實際上還是有方法的。

其實方法很簡單,就是用javascript來新增script標籤,像是支援度最高的document.write法:



document.write("<script type=\"text/javascript\" src=\"http://othree.net/tmp/test.js\"><\/script>");


或是標準的DOM方法(如果使用application/xhtml+xml的mime type就不得不用這種方法了):



var z1 = document.createElement("script");
z1.type = "text/javascript";
z1.src = "http://othree.net/tmp/test.js";
document.getElementsByTagName("head")[0].appendChild(z1);


不過這和抓資料有什麼關係呢?重點在遠端的那個javascript內容,它可以把需要的資料存到一個變數內,像是:



testvar = "You got me !";


這時問題又來了,一般web service就是直接提供JSON字串或是XML字串,並不會像上面轉成變數,這確實是最大的問題,目前我的解決方法還是需要透過一個自己可以動的server把web service回傳的字串包裝成上面的樣子再傳給網頁,不過這樣速度還蠻慢的,而且也不是每個人都有辦法弄出支援PHP、Perl等server side script的空間,而且要是有作這種東西的話就不會有跨網域的問題了吧,不過這我目前也沒辦法啦><。



還有一個問題,要怎樣抓到遠端script完整執行完的事件呢?這我試驗了很久,目前的作法如下:



<script type="text/javascript">
document.write("<script type=\"text/javascript\" src=\"http://othree.net/tmp/test.js\"><\/script>");
</script>
<script type="text/javascript">
alert(testvar);
</script>


沒錯,你需要兩個script標籤才能確保下面的alert事件會等到遠端script執行完才會動作,這當然是很爛的作法,因為是hard code,而且要把script寫在html原始碼裡面,有違行為、內容樣式分開的原則,加上不能包在function裡面,不過為了IE、Safari兩個瀏覽器的支援,不得不這樣寫......好吧,其實還有個方法,僅限於你能決定web service回傳的檔案內容是什麼時,當然為了解決前一個問題所作的web service proxy也是可以辦得到的,就是把遠端script的內容改成:



testvar = "You got me !";alert(testvar);


就是遠端script的最後自己呼叫該執行的function,恩,還是很不好看,不過至少是我目前找的唯一方法。



補充:根據這兩天的測試,Firefox和Opera在script的執行順序很合直覺,IE在一個script區塊裡面一定會先把本地端的執行完才執行遠端的,Safari則是同時跑兩邊。

2007年5月1日 星期二

iThome 電腦報 292 期的報導

謝謝 iThome 及其所屬記者王宏仁先生。有趣的是,原先我們並未邀請任何媒體。:)

另外,「首次」這樣的帽子有些沉重,頂多只能說是小小地在「跨社群」(也未必啦)上拋磚引玉罷了。最重要的是謝謝所有與會者的付出。m(_ _)m

Taiwan Hackathon - iThome News, No. 292

跑新聞出雜誌總是很辛苦的,還請有興趣看內文的人花點小錢到書店買一本囉!

2007年4月16日 星期一

2007/4/12-13 Receipts: 收據徵信

由公正的第三方 plasmaball (:p) 見證:

還欠一張 220 的發票,用於文具。等等找到了之後再補上來。

2007年4月13日 星期五

YASA widget

感謝 othree, gugod, hlb 的大力協助,clsungYASA 現在可以放上 blogger sidebar 了。XD

請把下列 JavaScript 貼到 blogger widget 裡,your_URL_here 換成想試試看的網頁,可以是 HTML 或RSS/Atom,純文字就對了。
<script>
z=document.body.appendChild(document.createElement('script'));
z.type='text/javascript';
z.setAttribute('charset', 'UTF-8');
z.src='http://yasa.newzilla.org/demo/index3.php?freq=10&min=2&url=http://your_URL_here';

z=document.body.appendChild(document.createElement('script'));
z.type='text/javascript';
z.src='http://taipedia.selfip.info/yasa.js';
</script>
<div id="yasa"></div>



例如,餵進 Once in a Blue MoonRSS,sidebar 就變成這樣:



如果你打算餵進去的資料「不是」UTF-8 編碼,以 Big5 為例,請換成這種語法:http://yasa.newzilla.org/demo/index3.php?encoding=big5&freq=10&min=2&url=your_URL_here

已知問題:Safari 還不能用…… orz (IE? 那是什麼?好吃嗎?)
原始碼:

2007年4月12日 星期四

2007/4/12-13 Diet: 飲食

提供,點下圖看菜單:

點圖看菜單

2007/4/12-13 Sponsorship: 贊助單位

感謝 Google 台灣工程研究所協助,向 Google 總公司申請了活動經費。


感謝 Cobrasonic 支援 OSDC.tw 2007 並派出 mikimoto 全程參與黑客鬆和 OSDC.tw 2007


感謝 OpenVanilla 支援 svn/trac hosting。


本次黑客鬆與 OSDC.tw 2007 協同舉辦,故亦須感謝 OSDC.tw 2007 的贊助單位,特別是居中協調 Google 贊助事宜的自由軟體鑄造場

2007/4/12-13 Invitation: 邀請函

轉載自〈黑客鬆:邀請函

黑客鬆將於本週四下午和晚上 (13:30-21:30) 、本週五上午和下午 (09:30-17:30) 兩個時段舉行,地點在南海藝廊。

如果有人願意在這兩個時段之中抽空前來,但有請假方面的困擾,主辦單位提供一份邀請函,望能略盡棉薄之力。樣本如圖所示:

The sample of Hackathon Invitation Letter


歡迎來信索取:barabbas_AT_gmail_DOT_com