MozTW 討論區

各項 Mozilla 相關軟體與技術討論
現在的時間是 2024-04-25, 03:58

所有顯示的時間為 UTC + 8 小時





發表新文章 回覆主題  [ 6 篇文章 ] 
發表人 內容
文章發表於 : 2009-06-02, 15:58 
離線

註冊時間: 2009-06-02, 14:40
文章: 3
來自: 桃園楊梅
想請問有關 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就正常.


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2009-06-02, 16:45 
離線

註冊時間: 2005-04-25, 18:44
文章: 166
用Firefox 3.5 beta4測試
變數本身似乎沒有5k的限制...
我試到10k都沒問題

所以我覺得問題應該是出在其他地方吧...
因為像是Google Reader那些東西用Ajax抓東西的時候應該常常超過5K...


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.0.30729)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2009-06-03, 01:06 
離線

註冊時間: 2009-06-02, 14:40
文章: 3
來自: 桃園楊梅
謝謝您的回答,我有找到底下這篇文章.

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


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2009-06-03, 02:35 
離線

註冊時間: 2005-02-16, 11:07
文章: 575
呃~所以根據 https://bugzilla.mozilla.org/show_bug.cgi?id=194231 的結論,
意思是 當您把抓回來的 js 碼塞進 form1 的 innerHTML 後,
Firefox 會自動拆成多個 4K 大小的子節點?

而解決的方法是在 form1 塞完後再寫一行 document.normalize();
就可以把這堆 4K 4K 大小 node 給重新合併起來?


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2009-06-04, 22:13 
離線

註冊時間: 2005-04-25, 18:44
文章: 166
我在想你的例子是下載javascript回來執行
何不考慮直接 eval() ?


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.0.30729)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2009-06-05, 00:31 
離線

註冊時間: 2009-06-02, 14:40
文章: 3
來自: 桃園楊梅
因為問題剛發生時,不知有子節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()的便利性.


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
 個人資料  
引用回覆  
顯示文章 :  排序  
發表新文章 回覆主題  [ 6 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 4 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
Powered by phpBB® Forum Software © phpBB Group
正體中文語系由 竹貓星球 維護製作
© moztw.org, Mozilla Foundation
MozTW,Mozilla 台灣社群