2010-08-29 50 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