簡體   English   中英

IE9意外重啟

[英]Unexpected restart on IE9

我正在開發Java applet,並在IE9上遇到問題。 在我們的設計中,當選擇/取消選擇特定選項卡時,將在文檔中添加和刪除applet。

1)突出選項卡時,小程序顯示良好。 在Java控制台中,我看到以下消息:

basic: Added progress listener
 basic: Plugin2ClassLoader.addURL parent called for XXX

basic: Applet initialized
 basic: Starting applet

basic: Applet made visible
 basic: Applet started
 basic: Told clients applet is started

2)取消選擇選項卡時:在Java控制台中

basic: Starting applet teardown

basic: Finished applet teardown
 basic: Removed progress listener: 

緊隨其后(不確定小程序是誰以及為什么再次啟動)

basic: Added progress listener:

basic: Plugin2ClassLoader.addURL parent called for

basic: Applet loaded.

basic: Applet resized and added to parent container

basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 106964 us, pluginInit dt 45402059 us, TotalTime: 45509023 us

basic: Applet initialized

basic: Starting applet

basic: completed perf rollup

當文檔模式切換到IE8時,該小程序也可以正常工作。 另外,Firefox也可以正常工作...

順便說一句,我正在使用以下版本的JRE

版本:7.0.150.3

有什么想法為什么要重新啟動applet?

(在同一問題上,我也遇到了您的MSDN TechNet論壇消息。)

我只是通過一個類似的項目解決了您的問題:我們正在從單頁應用程序的DOM中注入和刪除applet,在這里我們無法期望永遠注入它們並消耗資源,而且事實證明這太困難了嗎?在選項卡中,為了使applet長時間存活(幾天),我們可以處理我們支持的所有瀏覽器怪癖。 由於applet生命周期的管理並沒有真正執行,並且隨瀏覽器的不同而不同,因此有些人會殺死它們,使用“短期” applet被證明總體上“更安全”和“更簡單”。

也就是說,除了IE9中的2個問題:

  • 如果不強制IE9為每個小程序使用單獨的JVM,則在嘗試重新注入並重新執行小程序時,在某些配置下它將崩潰。
  • 經過一次Windows更新后,我懷疑是2月12日的KB2792100解決了安全公告MS13-009 (我們目前正在處理的安全公告)。

請注意,我不完全確定是什么觸發了IE9的行為,但我會懷疑在刪除小程序時出現內部競爭狀況(或者奇怪的保護措施是假定刪除小程序是錯誤的,除非它似乎並不總是如此。麻煩它)。

另外,對於我提到的兩個問題,我至少找到一個沒有發生問題的工作站,而無需確定原因(硬件配置,win +即版本,java插件版本...)。 除了我的機器(使調試變得更加有趣)之外,所有同事的工作站和我們的測試服務器都將始終失敗。

解決方法

解決該問題的方法並不令人滿意,但現在我們可以解決:我們有IE9的特殊情況。 希望IE10沒有錯誤,並且IE8甚至IE8(在IE8模式下)或在MSDN發布中提到的IE9(在不同的兼容模式下)似乎都不會觸發此問題。

因此,對於優秀的IE9來說,我們的工作確實是使用更傳統的長壽命applet,並使用JS與Java進行通信以使其按需執行,而我們跳過了DOM刪除部分...這意味着我們可能需要通知用戶,如果Java插件不起作用或IE決定終止小程序,則它們可能偶爾需要刷新其選項卡或類似的內容。

希望下次更新不會使情況變得更糟。

替代解決方法

我也發現了一些奇怪的東西。 通常情況下,我們正在清除從DOM的小程序,當它被完成的 :它的任務完成后,它會觸發一個JS調用回,這反過來會從母體取出的小程序。 並且,以防萬一,在注入新的applet之前,我們還將刪除所有現有的applet,以防以前的applet無法正確刪除。

現在,這兩個星期都將失敗。

但是我注意到我可以注入該applet,然后使用setInterval()啟動一個重復函數,並定期檢查該applet,然后在該applet可用時立即將其刪除。 奇怪的是,使用這種方法不會發生錯誤!

但是,我沒有沿着這條路線走:

  • 我真的不喜歡出於特殊原因添加這種奇怪的計時器,並且有可能永遠不會被丟棄,
  • 恐怕該applet可能會在完成其工作之前被刪除並提前終止。 似乎並非如此,但是由於這類東西是“未指定的”,因此我寧願不要管它。

您可以嘗試的其他方法

您可以嘗試使用<object>標記而不是<applet>標記。 這實際上是針對IE的建議,但我們無法這樣做,因為我們希望小程序在注入時自動啟動,並且由於某些原因,IE8(我們支持的所有限制瀏覽器中的唯一一個)會拒絕自動啟動小程序。頁面加載后注入。 因此,您可以檢查是否可行,如果可以,並且不需要IE8,您可能會很滿意(或者可以代替上面的特殊情況,對IE8和IE9使用不同的標記)。

但是我還沒有機會嘗試。

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM