今天解決一個bug時花了很長時間分析定位。
起因是我們自己寫了一個tab函數,用來支援網頁上分tab顯示内容,可以局部更新,支援緩存和重新整理。
但是後來發現,refresh content的時候采用AJAX方式取資料,而資料中的js腳本并不會執行。一開始不知道為什麼會這樣,我一直以為隻要設定innerHTML就會執行包含的js,單獨寫了兩個頁面用prototype的Ajax.updater試驗,也是可以執行的,真是搞不懂。
前輩教導我們,搞不定的時候讀源碼永遠是一個好主意。于是看prototype──哦,原來如此:
javascript 代碼
- update: function(element, html) {
- html = typeof html == 'undefined' ? '' : html.toString();
- $(element).innerHTML = html.stripScripts();
- setTimeout(function() {html.evalScripts()}, 10);
- return element;
- },
設定innerHTML時并不會做什麼js的執行工作,其實是prototype幫我們完成了工作。真是實踐中凝結的代碼阿,它專門擴充了String類,添加了 stripScripts和 evalScripts,讓我們友善許多。
嗯,看來我這個半瓶子水還是要多看看源碼的。