2009-12-21 71 views
2

我遇到了Firefox和Dojo的奇怪行爲。我有在<頭>節這幾行HTML頁面:dojo.require()阻止Firefox呈現頁面

... 
<script type="text/javascript" src="dojo.js" djconfig="parseOnLoad: true, locale: 'de'"></script> 
<script type="text/javascript"> 
    dojo.require("dojo.number"); 
</script> 
... 

有時在頁面加載正常。但有時它不會。 Firefox將獲取整個html頁面,但不會呈現它。我只看到一個灰色的窗戶。

經過一番實驗後,我發現渲染問題與html的加載時間有關。 Firefox在加載時開始評估html頁面。如果頁面需要太長的時間才能加載上面的javascript,那麼在html完成加載之前將執行該JavaScript。

如果發生這種情況,我會得到灰色的窗口。建議Firefox向我展示頁面的源代碼將顯示正確的完整HTML代碼。但是:如果我的頁面保存到磁盤(文件 - >頁面另存爲...),HTML代碼將被截斷,上述部分將是這樣的:

... 
<script type="text/javascript" src="dojo.js" djconfig="parseOnLoad: true, locale: 'de'"></script> 
<script type="text/javascript"> 
    dojo.require("dojo.number"); 
</script></head><body></body></html> 

這就解釋了爲什麼我能看到一個灰色地帶。但爲什麼這個代碼出現在那裏?我認爲Dojo的require()方法做了一些「邪惡」的事情。但我無法弄清楚什麼。沒有write.document(「</head > <body> </body > </html >」);在Dojo代碼中。我檢查了它。

如果我放置dojo.require(「dojo.number」),問題將被修復。聲明在window.load事件:

<script type="text/javascript"> 
    window.load=function() { 
     dojo.require("dojo.number"); 
    } 
</script> 

但我很好奇爲什麼會發生這種情況。是否有Javasctript函數強制Firefox停止評估頁面? Dojo會做一些「壞」的事嗎?任何人都可以向我解釋這種行爲嗎?

編輯:Dojo 1.3.1,沒有JS錯誤或警告。

+1

您是否嘗試安裝Firebug並查看頁面實際加載的方式?你還在用什麼版本的dojo? – Kitson 2009-12-21 22:38:56

+0

除了查看如何在Firebug網絡面板中加載頁面,您是否嘗試過檢查是否存在任何JS錯誤? – Annie 2009-12-21 22:43:11

+0

Firebug讓我發現時機會觸發它。但沒有更多有用的信息。 – 2009-12-21 22:43:19

回答

0

頁面的其他部分是什麼樣的?應該渲染哪些元素不是?你有什麼其他的Javascript?

你看起來很好,但是你將無法使用dojo.number中的方法或其他任何通過dojo.require加載的內容,直到頁面加載完畢 - 你必須等待window.onload觸發,或者使用dojo.addOnLoad()方法觸發回調。後者實際上比onload快一點。

dojo.require使用synch xhr來加載阻止瀏覽器的負載,所以如果負載異常緩慢,您會注意到頁面渲染延遲。

+0

正如我寫的,頁面根本不渲染。在dojo.number中使用方法不是問題。渲染沒有延遲。 Firefox只是沒有。 – 2009-12-22 09:50:21

+1

是的,但它可能有助於瞭解頁面上還有哪些內容,或者生成此行爲的最簡單可能的順序。這個片段不僅需要重現這個問題,還必須發揮一些互動作用。 – peller 2009-12-22 18:06:31

0

我認爲這是Firefox中的一個渲染錯誤,我在許多上下文中看到,其中一個公共因素是瀏覽器加載頁面中加載的所有資源所需的時間。頭腦中需要花費很長時間才能通過網絡或eval請求的腳本越多,碰到的機會就越高。使用熱緩存打印頁面顯着降低了遇到繪製錯誤的可能性。減輕它的另一種方法是將JavaScript放在最後,這也是一個最佳實踐,因爲它不會立即阻止瀏覽器預覽標記。

關於使用dojo的具體情況,常見用例包括運行onload,如創建和啓動小部件。如果您在使用dojo模塊(如widget)的onload處理程序中有代碼,請粘貼dojo。在onload處理程序中需要語句,而不是在onload處理程序之前。如果您以後不需要它,那麼承受性能損失或阻止最初的UI渲染毫無意義。然後構建自定義的dojo圖層以包含最小的核心(可能是一個自定義的基礎,使其更小)以及另外90%的需求。在頭部加載最小的核心層(以獲得dojo.addOnLoad等),然後在主體的末端加載其他層。如果您生活在一個模塊化應用程序框架中,根據您所在的頁面,應用程序在頁面內容區域中來來去去,每個應用程序應該在其實際引用模塊之前立即爲其使用的相應dojo模塊放置dojo.require語句。

如果您需要立即在內聯腳本中使用模塊,這將無法正常工作,但如果是這種情況,則自定義dojo構建也將有助於緩解該情況。

我不知道Mozilla的一個報告問題,但是我也在前一段時間在其他瀏覽器上看到過這種情況。