我正在研究Java applet并在IE9上遇到问题。在我们的设计中,当选择/取消选择特定选项卡时,将在文档中添加和删除小程序。
1)当选项卡被选中时,applet显示正常。在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:
紧接着(不知道applet是谁以及为什么再次启动)
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也可以正常工作......
BTW,我正在使用以下版本的JRE
版本:7.0.150.3
为什么这个意外重启applet的想法?
答案 0 :(得分:0)
(我也在同一问题上看到了您的MSDN TechNet论坛消息。)
我刚刚用一个类似的项目来解决你的问题:我们从单页面应用程序的DOM中注入和删除applet,在那里我们不能期望永远注入它们并消耗资源,而且它是事实证明,在一个标签中长时间(天)保持applet存活时,我们支持的浏览器的所有怪癖都难以处理。由于applet生命周期的管理并没有真正实施,并且因浏览器的不同而有所不同,有些人会将其删除,并使用“短命”applet证明总体上“更安全”和“更简单”。
即IE9中的2个问题:
请注意,我并不完全确定触发IE9的行为是什么,但我会怀疑在删除applet时的内部竞争条件(或者一种奇怪的保护措施,假设删除它是一个错误,除非它没有似乎总是打扰它。)
另外,对于我提到的两个问题,我发现至少有一个工作站没有发生问题,而没有确定原因(硬件配置,win + ie版本,java插件版本......)。我的所有同事的工作站和我们的测试服务器都会一直失败,除了我的机器(使调试变得更加有趣)。
我们解决这个问题的方式并不令人满意,但我们现在正在努力解决这个问题:我们对IE9有一个特例。希望IE10没有错误,IE8甚至IE9在IE8模式下或者在MSDN中提到IE9在不同的兼容模式下提到似乎没有触发问题。
因此,对于好的IE9,我们所做的确实是使用更传统的长寿命小程序,并使用JS与Java通信使其按需执行我们想要的操作,并且我们跳过DOM删除部分......这意味着我们可能需要通知用户他们可能偶尔需要刷新他们的标签或类似的东西,如果java插件没有行为或IE决定杀死小程序。
希望下一次更新不会让情况变得更糟。
我也发现了一些奇怪的东西。通常,我们在完成时从DOM中删除applet:在完成任务后,它会触发JS回调,这反过来会从父进程中删除applet。而且,为了以防万一,我们还会在注入新applet之前删除任何现有的applet,以防前一个applet没有被正确删除。
现在这两个都会失败,因为几个星期。
但是我注意到我可以注入applet,然后用setInterval()
启动一个重复的函数,并定期检查applet,然后在它看到它时可以立即删除它。奇怪的是,使用这种方法不会发生错误!!
然而,我没有沿着这条路走下去:
您可以尝试使用<object>
代码而不是<applet>
代码。这实际上是推荐用于IE,但我们不能这样做,因为我们希望applet在注入时自动启动,并且出于某种原因IE8(我们支持的 all 唯一的
但我还没有机会尝试(还)。
祝你好运。