2009-11-25 79 views
1

我使用基於this page的腳本標記長輪詢技術實現Comet。繼我的previous question後,我已經完成了所有工作,除了一個煩惱,只發生在Firefox。Firefox不執行一個動態加載的<script>元素,直到加載另一個元素

在初始頁面加載我的Comet客戶端的JavaScript發送兩個請求到彗星服務器(在動態生成<script>標籤被添加到DOM的形式):

  1. get_messages - 這是正在進行的調查來自應用程序的消息。
  2. initialise - 這是啓動時的一次性請求。

這兩個發生在同一時間 - 也就是說,他們兩個的<script>標籤存在於DOM相同。 (我可以在Firebug DOM檢查器中看到它們)。服務器立即發送一些腳本作爲對initialise請求的響應,但它不會發送任何請求給get_messages請求,除非實際上有消息,這可能需要一段時間。

在Firefox 3.5中<script>標記爲initialise請求返回的腳本沒有得到執行,直到其他<script>標記(get_messages)還加載!在Chrome 3和IE 8中,這種方式運行良好 - 只要收到腳本,腳本就會立即執行。

爲什麼Firefox會這樣做,我該如何解決?我想我可以嘗試通過在initialise響應的同時發送一個虛擬的「消息」來解決它在服務器上的問題,但這是相當黑客。如果可能,我想理解並正確解決此問題。

回答

3

對我來說似乎是加載順序的問題。 Firefox始終確保排隊的請求按請求的順序執行。 IE做不是確保這一點(不知道關於Chrome)。無論如何,如果你不應該在初始化代碼之後調用get_messages,那麼你仍然希望在初始化函數的回調中觸發該請求。無論如何,你都會這樣做,因爲其他瀏覽器也可能不一致。當然,IE6的加載順序與其他瀏覽器的工作方式不同 - 在長輪詢請求完成之前它不會繼續加載DOM,因此,您只能等待較長的輪詢時間間隔才能看到主DOM負載。

如果您需要詳細信息,可以查看我們的JavaScript客戶端的源代碼,但是在構建ASP.NET Comet服務器WebSync時遇到了類似的問題。來源可以在這裏查看:

http://sync.frozenmountain.com/client.ashx?debug=true 

搜索「ie6」查看一些解決方法。

+0

謝謝,這是有道理的。不幸的是,它並不能解決我的問題,因爲get_messages請求會在任何給定的時間運行,並且可以隨時發送新的訂閱請求。 我不得不在原帖(還有一些)中提到的黑客攻擊,這讓它工作。我還沒有在IE6中測試過,但幸運的是這是給內部用戶使用的,IE6不受支持。 – EMP 2009-11-29 22:12:28

0

我不知道爲什麼會出現這種情況,但也許一個簡單的解決方法是僅在初始化請求完成後添加get_messages <script>標記。 (我認爲你有一些處理初始化請求響應的回調。)

相關問題