2010-08-29 49 views
3

我有一些運行在由Java小程序啓動的線程中的長時間運行的Java代碼。代碼一旦完成,它就會爲用戶提供信息。我想以線程安全的方式將此信息傳遞給JavaScript回調。只是使用Java DOM API來修改HTML文檔不夠好,除非我的JavaScript回調以線程安全方式(即最終在執行JavaScript回調的同一瀏覽器線程中)作爲副作用被調用。我怎樣才能實現這個?有沒有圖書館已經在做它?如何從Java applet線程調用JavaScript回調?

回答

0

似乎沒有公開教程如何做到這一點。整個JavaScript - Java接口沒有記錄,並且受到瀏覽器限制。

+1

但看看這裏:https://jdk6.java.net/plugin2/liveconnect/ – flup 2014-01-10 15:39:34

2

看起來好像Common DOM API是你所需要的。實質上,你可以請求一個DOMService在主UI線程中回調,並且它已經準備就緒。

http://docs.oracle.com/javase/1.5.0/docs/guide/plugin/developer_guide/java_js.html

據我瞭解的東西,JSObject是 「老辦法」 和公共DOM API是較新的方式(如Java 6)。你需要做的是調用你的小程序的方法,並傳遞你想要回調的函數對象。然後你的applet從你的DOMAction中調用該函數對象。

我沒有任何代碼可以向您展示,這不是我在使用Java之前完成的。不過,我使用了一種類似的技術,使用用C++編寫的NPAPI Web插件,即JS調用我的C++對象傳遞一個函數作爲參數,然後在稍後階段讓C++對象調用JS函數。 '希望這有助於。

+0

當然可以,但我該怎麼寫我在我的'DOMAccessor.run'?我應該嘗試獲取對'JSObject'的引用,並嘗試從那裏調用回調?或者我應該嘗試修改DOM,並希望JavaScript能夠檢測到(例如DOMAttrModified) - 但這僅在少數瀏覽器中受支持,並且在Internet Explorer中不受支持。你能給一個跨瀏覽器的代碼示例有效嗎? – pts 2010-08-30 06:17:59

1

我有多個applet線程調用Javascript的併發問題。一些電話被Internet Explorer 8忽略(Firefox 3.6和Safari 5工作正常)。

我試圖用DOMService.invokeAndWait打電話給Javascript - 這沒有幫助。我最終確保所有的Java-> Javascript調用都來自同一個線程,並且我的問題得到了解決(至少暫時 - 我沒有檢查過,如果Javascript線程忙於某些用戶定義的操作,發起的工作)。

序列化的呼叫,我用Executors.newSingleThreadExecutor