有没有可能注册一个JavaScript事件,当Java applet完全加载时触发?

3

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

6个回答

5

Javascript调用非常简单:

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

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

}

我希望在HTML和/或JavaScript中有一些机制,比如在<applet>标签上设置onload="init()"之类的。但如果不行的话,我可能只能按照您提出的方式从applet内部应用它... - awe

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.");
    });

我尝试过这个,但在MSIE中to的值是“object”。而Firefox则在此处给出“function”。我只是更改了检查以支持两者:if (to == 'function' || to == 'object') - awe
谢谢!我修复了这个例子,以帮助那些脚本小子们。 - Chris Chubb
我刚试了一下,typeof (document.getElementById(applet_id))总是_object_即使id不存在!!所以它实际上并没有检查任何东西。对我来说它总是成功回调。 - rolgalan
你在网页上嵌入小程序时使用了哪个HTML元素?是applet / object / embed? - Mark Cooper

2

您在Java小程序中有一个初始化函数(我认为它是“run”),从那里,您可以在初始化工作之后调用网页中的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

2
你可以使用param标签将JS函数的名称传递到你的applet中:
<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
        archive="Applet.jar" MAYSCRIPT>
  <param name="applet_ready_callback" value="myJSfunction"/>
</applet>

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

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

0

Java 7 SE 可以实现。您可以注册 onLoad() 事件或者轮询 status,请参考 Handling Initialization Status With Event Handlers 的示例。

为了使用这个功能,您需要将小程序部署时设置 java_status_events 参数为 true

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

状态

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

事件

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

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

// 使用匿名函数
applet.onLoad(function() {
  // 准备就绪状态的事件处理程序
}

// 使用常规函数
function onLoadHandler() {
  // 准备就绪状态的事件处理程序
}

// 使用方法形式
applet.onLoad(onLoadHandler);

// 使用属性形式
applet.onLoad = onLoadHandler;

0

我使用了另一种方法从小程序中调用JavaScript函数。

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

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


我的问题是Applet是第三方的,所以我无法访问更改Applet的内部。我只需要知道何时完全加载Applet,以便我知道何时可以调用其中的方法。 - awe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接