1

我正在开发一个 Java 小程序并在 IE9 上遇到问题。In our design applet would be added and removed from the document when a particular tab is selected/deselected.

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

任何想法为什么会意外重启小程序?

4

1 回答 1

0

(我还看到了您在同一问题上的 MSDN TechNet 论坛消息。)

我刚刚在一个做类似事情的项目中遇到了你的问题:我们正在从单页应用程序的 DOM 中注入和删除小程序,我们不能指望永远注入它们并消耗资源,而且事实证明这太困难了处理我们支持的浏览器的所有怪癖,以使小程序在选项卡中长时间(几天)保持活动状态。由于小程序生命周期的管理并没有真正强制执行,并且因浏览器而异,因此有些人会杀死它们,并且使用“短期”小程序被证明总体上“更安全”和“更简单”。

也就是说,除了 IE9 中的 2 个问题:

  • 如果不强制 IE9 为每个小程序使用单独的 JVM,它会在尝试重新注入和重新执行小程序时在某些配置下崩溃。
  • 在我怀疑是 2 月 12 日的KB2792100解决安全公告MS13-009的 Windows 更新之后,我们目前正在处理的那个。

请注意,我不完全确定是什么触发了 IE9 的行为,但我会怀疑在删除小程序时存在内部竞争条件(或者会假设删除它是错误的奇怪保护措施,除非它似乎并不总是打扰它)。

此外,对于我提到的这两个问题,我发现至少有一个工作站没有出现问题,但没有确定原因(硬件配置、win + ie 版本、java 插件版本......)。我所有同事的工作站和我们的测试服务器都会失败,除了我的机器(这让调试变得更加有趣)。

解决方法

我们解决它的方式并不令人满意,但我们现在就这样做了:我们有一个针对 IE9 的特殊情况。希望 IE10 没有错误,并且 IE8 甚至 IE9 在 IE8 模式下或如您在 MSDN 帖子中提到的 IE9 在不同的兼容模式下似乎不会触发问题。

所以对于好的 ol' IE9,我们所做的确实是使用更传统的长寿命小程序,并使用 JS 到 Java 通信来使其按需执行我们想要的操作,并且我们跳过了 DOM 删除部分......这意味着我们可能需要通知用户,如果 java 插件没有运行或 IE 决定终止小程序,他们可能偶尔需要刷新他们的选项卡或类似的东西。

希望下一次更新不会让情况变得更糟。

替代解决方法

我还发现了一些很奇怪的东西。通常,我们在完成后从 DOM 中删除小程序:在其任务完成后,它会触发 JS 回调,这反过来会从父级中删除小程序。而且,为了以防万一,我们还会在注入新的小程序之前删除任何现有的小程序,以防前一个小程序没有被正确删除。

现在这两个都失败了,因为几个星期。

但我注意到我可以注入小程序,然后启动一个重复的函数setInterval()并让它定期检查小程序,然后在看到小程序可用时立即删除它。奇怪的是,使用这种方法不会发生错误!

但是,我没有走这条路:

  • 我真的不喜欢出于临时原因添加这种奇怪的计时器,并冒着永远不会被丢弃的风险,
  • 恐怕小程序可能会在完成工作之前被删除并提前终止。似乎并非如此,但由于那种东西相当“未指定”,我宁愿不理会它。

您可以尝试的其他事情

您可以尝试使用<object>标签而不是<applet>标签。这实际上是为 IE 推荐的,但我们不能这样做,因为我们希望小程序在注入时自动启动,并且由于某种原因 IE8(我们支持的所有浏览器中唯一的一个)会拒绝自动启动小程序在页面加载后注入。因此,您可以检查它是否有效,如果有效并且您不需要 IE8,您可能是黄金(或者不是像上面这样的特殊情况,您可以为 IE8 和 IE9 使用不同的标签)。

但我还没有机会尝试(还)。

祝你好运。

于 2013-03-20T17:24:56.103 回答