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

时间:2010-12-10 09:22:57

标签: java javascript events applet

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

6 个答案:

答案 0 :(得分:5)

javascript调用相当简单:

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

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

}

答案 1 :(得分:3)

如果您没有对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.");
    });

答案 2 :(得分:2)

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

<applet id="someId" code="JavaApplet.class" codebase="/foo" archive="Applet.jar" 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

答案 3 :(得分:2)

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

<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
        archive="Applet.jar" MAYSCRIPT>
  <param name="applet_ready_callback" value="myJSfunction"/>
</applet>

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

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

答案 4 :(得分:0)

我用另一种方法从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函数。

答案 5 :(得分:0)

Java 7 SE是可行的。您可以注册onLoad()个活动或仅轮询status,请参阅Handling Initialization Status With Event Handlers以获取示例。

要使用此功能,您应该将java_status_events参数设置为true来部署小程序。

文章Applet Status and Event Handlers概述了状态和事件:

  

状态

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

活动

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

您可以在网页的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;