是否可以注册java小程序完全加载时触发的javascript事件?

是否可以注册java小程序完全加载时触发的javascript事件?,java,javascript,events,applet,Java,Javascript,Events,Applet,我有一个web应用程序,它使用标记中定义的java小程序。是否可以添加在小程序完全加载后触发的javascript事件?这是一些初始化javascript,取决于小程序是否已完全加载且有效。您在java小程序中有一个初始化器函数(我认为它正在运行)。在初始化工作完成后,您可以在web页面中调用javascript。 要工作,必须将MAYSCRIPT属性添加到小程序定义中 <applet id="someId" code="JavaApplet.class" codebase="/foo"

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

您在java小程序中有一个初始化器函数(我认为它正在运行)。在初始化工作完成后,您可以在web页面中调用javascript。 要工作,必须将MAYSCRIPT属性添加到小程序定义中

<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
publicstringinvokejavascript(对象调用方,stringcmd)抛出TiNT4Exception{

printDebug(2,“启动JavaScript>>”+cmd+“JavaScript调用相当简单:

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

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

}

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

<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
        archive="Applet.jar" MAYSCRIPT>
  <param name="applet_ready_callback" value="myJSfunction"/>
</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函数

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()
事件或只轮询
状态,请参阅示例

为了使用此功能,您应该在部署小程序时将
java\u status\u events
参数设置为
true

这篇文章概述了现状和事件:

地位
  • 加载
    =1-小程序正在加载
  • READY
    =2-小程序已完全加载并准备好接收JavaScript调用
  • 错误
    =3-加载小程序时出错
事件
  • onLoad
    :当小程序状态为
    READY
    时发生。小程序已完成加载并准备好接收JavaScript调用
  • 顶部
    :小程序停止时发生
  • onError
    :当小程序状态为
    错误时发生。加载小程序时出错
您可以在网页的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;

我希望在HTML和/或JavaScript中使用一些机制,比如在标记上设置onload=“init()”或其他什么。但如果不可能,我可能只需要按照您的建议从小程序中应用它……我尝试了这一点,但在MSIE中,
to
的值是
“object”
。Firefox提供
函数“
在这里。我刚刚更改了检查以支持这两个选项:
if(to=='function'.\124; to=='object')
。Gracias!我修复了这个示例以帮助脚本kiddies。我刚刚尝试了这个和
typeof(document.getElementById(applet\u id))
即使id不存在,也始终是object!!因此它实际上不检查任何内容。它总是落在successCallback上…您使用哪个html元素将小程序嵌入页面?applet/object/embed?我的问题是小程序是第三方,所以我没有权限更改小程序的内部。我只是需要我想知道小程序何时被完全加载,所以我知道何时可以在中调用方法。
// 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;