2010-03-22 63 views
6

我無法使Java Applet與託管Applet的頁面上的Javascript代碼進行通信。它有時會起作用,但其他時候它會引發一個模糊的例外,除了一些從未解決的Java錯誤報告(感謝Sun)之外,Google搜索還沒有發現任何有用的信息。Java Applet問題<--> Javascript通信

這裏是我使用的代碼:

JSObject win = JSObject.getWindow(this); 
Object[] args = new Object[1]; 
args[0] = "test argument"; 
String result = (String) win.call("testJSfunc", args); // XXX 

這裏是例外,我得到標記// XXX行。請注意,它是間歇性的。它通常有效,但有時它不會,使用相同的確切代碼。重複加載頁面會很快產生錯誤。

netscape.javascript.JSException: No registered plugin for applet ID 1 
    at sun.plugin2.main.client.MessagePassingJSObject.newJSException(Unknown Source) 
    at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source) 
    at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source) 
    at TestApplet.testCallJS(TestApplet.java:159) 
    at TestApplet.init(TestApplet.java:139) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

是否還有另一種我應該使用的Java和Javascript之間更穩定的通信方式?

---更多信息---

我使用的deployJava.js腳本由Sun提供嵌入在飛行的小程序。我確保MAYSCRIPT已啓用。我知道這對於MAYSCRIPT來說不是問題,因爲通信在某些時候是有效的。

+0

您是否在使用小程序標記來嵌入它? – Enrique 2010-03-22 19:39:32

回答

1

我想我已經通過設置classloader_cache=falseseparate_jvm=true解決了這個問題......一旦我設定這兩個的,間歇隱蔽的錯誤停止發生。希望這可以解決問題。

+0

不幸的是,這個解決方案導致applet完全無狀態。頁面重新加載或刷新後,所有靜態變量都將被清除。 – 2013-09-02 07:50:26

1

確保你在你的applet標記有MAYSCRIPT。

<applet id="..." code="..." name=".." codebase="..." archive="..." width="100%" height="100%" MAYSCRIPT> 
+0

是的,它在那裏。 MAYSCRIPT不應該是問題,因爲例外是間歇性的。有時它可以工作,有時它不會(只需重新加載頁面,不會更改任何代碼)。如果MAYSCRIPT是這個問題,它會在100%的時間內阻止通信。 – davr 2010-03-22 19:44:33

+0

我認爲插件2中忽略MAYSCRIPT。無論如何,它從未在所有瀏覽器中正確工作。 – 2010-03-22 19:48:25

+0

谷歌搜索'plugin2',有趣的是,不知道他們在java 1.6.10中引入的新插件體系結構是否存在一些錯誤。 – davr 2010-03-22 19:54:35

0

如果您將separate_jvm設置爲true,則對每個小程序實例化新Java VM會對性能造成非常不利的影響。如果你在頁面上有多個applet(30+),這很慢。

我不知道這個問題是否有其他解決方案。例如,我們有多個選項卡上的多個小程序。當第一個帶小應用程序的選項卡打開時,所有小應用程序都可以正確顯示而不會出現問題但是,切換到任何其他標籤結果與沒有註冊插件的錯誤。在IE中,這個錯誤不會發生,因爲在IE中,所有applet都會在添加到DOM時立即實例化。