是否可以注册在Java applet完全加载时触发的javascript事件?

我有一个Web应用程序,它使用在标记中定义的java applet。 是否可以添加applet完全加载后触发的javascript事件? 这是一些初始化javascript,它依赖于applet完全加载和有效。

如果您没有对applet进行源代码控制,则可以在调用其上的方法之前轮询要加载的applet。 这是我写的一个实用函数,它就是这样做的:

 /* Attempt to load the applet up to "X" times with a delay. If it succeeds, then execute the callback function. */ function WaitForAppletLoad(applet_id, attempts, delay, onSuccessCallback, onFailCallback) { //Test var to = typeof (document.getElementById(applet_id)); if (to == 'function' || to == 'object') { onSuccessCallback(); //Go do it. return true; } else { if (attempts == 0) { onFailCallback(); return false; } else { //Put it back in the hopper. setTimeout(function () { WaitForAppletLoad(applet_id, --attempts, delay, onSuccessCallback, onFailCallback); }, delay); } } } 

这样叫:

 WaitForAppletLoad("fileapplet", 10, 2000, function () { BuildTree("c:/"); }, function () { alert("Sorry, unable to load the local file browser."); }); 

javascript调用相当简单:

你的init()方法可以包含jsObject声明和javascript调用:

 @Override public void init() { // some code JSObject jsObject = JSObject.getWindow(this); jsObject.eval("your javascript"); } 

你在java applet中有一个初始化函数(我认为它是运行的)。 从那里你可以在初始化工作后在网页中调用javascript。 要工作,您必须将MAYSCRIPT属性添加到您的applet定义

   

调用JavaScript的代码示例:

 public String invokeJavaScript(Object caller, String cmd) throws TiNT4Exception { printDebug(2, "Start JavaScript >>" + cmd + "<<"); try { // declare variables Method getw = null; Method eval = null; Object jswin = null; // create new instance of class netscape.javascript.JSObject Class c = Class.forName("netscape.javascript.JSObject"); // , true, this.getClass().getClassLoader()); // does it in IE too // evaluate methods Method ms[] = c.getMethods(); for (int i = 0; i < ms.length; i ++) { if (ms[i].getName().compareTo("getWindow") == 0) { getw = ms[i]; } else if (ms[i].getName().compareTo("eval") == 0) { eval = ms[i]; } } // for every method printDebug(3, "start invokings"); Object a[] = new Object[1]; a[0] = caller; jswin = getw.invoke(c, a); a[0] = cmd; Object result = eval.invoke(jswin, a); if (result == null) { printDebug(3, "no return value from invokeJavaScript"); return ""; } if (result instanceof String) { return (String)result; } else { return result.toString(); } } catch (InvocationTargetException ite) { throw new TiNT4Exception(ite.getTargetException() + ""); } catch (Exception e) { throw new TiNT4Exception(e + ""); } } // invokeJavaScript 

您可以使用param标记将JS函数的名称传递到applet中:

    

在你的applet中,获取param的值并在准备好时调用该函数:

 @Override public void init() { String jsCallbackName = getParameter("applet_ready_callback"); JSObject jsObject = JSObject.getWindow(this); jsObject.eval(jsCallbackName + "()"); } 

我用另一种方法从applet调用JavaScript函数。

 try { getAppletContext().showDocument(new URL("javascript:appletLoaded()")); } catch (MalformedURLException e) { System.err.println("Failed to call JavaScript function appletLoaded()"); } 

…必须在扩展Applet或JApplet的applet类中调用。 我在start()方法的末尾调用了JavaScript函数。

Java 7 SE可以实现。 您可以注册onLoad()事件或仅轮询status ,有关示例,请参阅使用事件处理程序处理初始化状态 。

要使用此function,您应该将applet与java_status_events参数设置为true部署。

文章Applet状态和事件处理程序概述了状态和事件:

状态

  • LOADING = 1 – 正在加载Applet
  • READY = 2 – Applet已完全加载并准备接收JavaScript调用
  • ERROR = 3 – 加载applet时出错

活动

  • onLoad :当applet状态为READY时发生。 Applet已完成加载并准备接收JavaScript调用。
  • onStop :小程序停止时发生。
  • onError :当applet状态为ERROR时发生。 加载applet时发生错误。

您可以在网页的JavaScript代码中注册或确定事件处理程序,如以下代码段所示。

 // use an anonymous function applet.onLoad(function() { //event handler for ready state } // use a regular function function onLoadHandler() { // event handler for ready state } // Use method form applet.onLoad(onLoadHandler); // Use attribute form applet.onLoad = onLoadHandler;