MozTW 討論區 https://forum.moztw.org/ |
|
firefox對於javascript的變數是否有5K的限制 https://forum.moztw.org/viewtopic.php?f=18&t=27015 |
第 1 頁 (共 1 頁) |
發表人: | flying [ 2009-06-02, 15:58 ] |
文章主題 : | firefox對於javascript的變數是否有5K的限制 |
想請問有關 javascript 問題,因為下面的程式碼片段在IE都正常.但碰到firefox就會回報錯誤 var msyntax; //由ajax傳回大於5K的javascript 程式碼,準備動態載入 var oScript = document.createElement( "script" ); oScript.language = "javascript"; oScript.type = "text/javascript"; oScript.id = "d_big_item2"; oScript.defer = true; oScript.text = msyntax; document.getElementsByTagName("head")[0].appendChild( oScript ); 將載入的javascript貼到文內 document.getElementById("form1").innerHTML=msyntax; 結果發現都是在5K位置被截斷,造成javascript執行錯誤,但此段程式在IE卻都正常,莫非firefox有限制javascript 變數只能放5K大小. 同時將msyntax的大小縮到5K以下,firefox就正常. |
發表人: | JackieKu [ 2009-06-02, 16:45 ] |
文章主題 : | |
用Firefox 3.5 beta4測試 變數本身似乎沒有5k的限制... 我試到10k都沒問題 所以我覺得問題應該是出在其他地方吧... 因為像是Google Reader那些東西用Ajax抓東西的時候應該常常超過5K... |
發表人: | flying [ 2009-06-03, 01:06 ] |
文章主題 : | |
謝謝您的回答,我有找到底下這篇文章. http://www.quirksmode.org/dom/tests/textnodesize.html#link1 他說 Mozilla and Opera split up one huge text node into several smaller text nodes. Mozilla's maximum size for a text node is 4K, Opera's is 32K. Explorer Mac seems to have a 64K limit. 大概的意思是對於比較大的文字區塊,browser都是以分散的節塊來處理,Mozilla firefox每個節點最大只有4K,我用的Extjs javascript library 只取firstChild,所以碰到4K以上的javascript動態載入就會發生錯誤,因為程式碼被截斷了.但IE一個節點可以容納64K,所以一直以為IE沒問題,其實是要動態載入的javascript尚未碰到超過64K的情況. 難怪firebug看console response Ajax都有送5K以上完整的文字,但用Inspect Element,就老是看到被折斷的文字. 底下是Extjs的人發表的,也提到此問題. http://extjs.com/forum/showthread.php?t=9766 |
發表人: | alex301 [ 2009-06-03, 02:35 ] |
文章主題 : | |
呃~所以根據 https://bugzilla.mozilla.org/show_bug.cgi?id=194231 的結論, 意思是 當您把抓回來的 js 碼塞進 form1 的 innerHTML 後, Firefox 會自動拆成多個 4K 大小的子節點? 而解決的方法是在 form1 塞完後再寫一行 document.normalize(); 就可以把這堆 4K 4K 大小 node 給重新合併起來? |
發表人: | JackieKu [ 2009-06-04, 22:13 ] |
文章主題 : | |
我在想你的例子是下載javascript回來執行 何不考慮直接 eval() ? |
發表人: | flying [ 2009-06-05, 00:31 ] |
文章主題 : | |
因為問題剛發生時,不知有子節size的限制,甚至不相信眼前所見,但有查Ajax確實是傳送完整的,在搞不清楚javascript內容在何程序過程被截斷時,甚至會懷疑firebug inspect element的內容是否有報錯,也才會進一步用div form1的innerHTML來塞javascript內容到畫面來看,這都只是確認資料被截斷的方法之一. 後來逐步追蹤Extjs拆解資料到其record過程的原始碼,幾乎就要確認Extjs並無主動放第二子節的動作,然照其設計師的說法,也不認為是Extjs的Bug,算是browser特性吧. 因為Ajax資料進入Record已被截斷,此後應不管用什方法將資料從其Extjs record取出,看到的都將是被截斷的javascript碼.不過針對這點,我還會持續測試確認. 我對document.normalize()應用還不熟,但如果Extjs record沒有第二子節以上來處理過長資料,我想用任何方法應該也都無效了才對. 我是下載javascript來執行沒錯,但因為是要動態設計Extjs grid與form panel的關係,單一個資料庫系統的網頁可能有多達幾十個data panel,牽涉到重複載入管理問題與考量分批載入效能,才會想說用Extjs 的store一次載入這幾十個data panel的syntax,再由其store逐一取出內存於record的syntax,成批動態產生data panel. 動態產生panel實際也是取record的syntax內容,也就是panel的javascript定義碼,再呼叫eval()來執行. 當然也可改成直接取Ajax回傳的panel syntax進行eval,但變成要request server來回幾十次. 另外一種做法也試過,是將data panel存成js檔,再動態呼叫執行,但這種方法沒有eval()的便利性. |
第 1 頁 (共 1 頁) | 所有顯示的時間為 UTC + 8 小時 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |