簡體   English   中英

是否可以注冊一個Java程序完全加載時觸發的javascript事件?

[英]Is it possible to register a javascript event that triggers when java applet is fully loaded?

我有一個Web應用程序,它使用在<applet>標記中定義的java applet。 是否可以添加在Applet完全加載后觸發的javascript事件? 這是一些初始化javascript,取決於小程序已完全加載且有效。

javascript調用非常簡單:

您的init()方法可以包含jsObject聲明和javascript調用:

@Override
public void init() {
// some code
  JSObject jsObject = JSObject.getWindow(this);
  jsObject.eval("your 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.");
    });

您在Java小程序中有一個初始化函數(我認為它已運行)。 初始化工作后,您可以從那里在網頁中調用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

您可以使用param標記將JS函數的名稱傳遞到小程序中:

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

在小程序中,獲取參數的值,並在准備好時調用函數:

@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 ,有關示例,請參見使用事件處理程序處理初始化狀態

為了使用此功能,應在java_status_events參數設置為true部署小程序。

Applet狀態和事件處理程序一文概述了狀態和事件:

狀態

  • LOADING = 1-Applet正在加載
  • READY = 2-Applet已完全加載並准備接收JavaScript調用
  • ERROR = 3-加載小程序時出錯

大事記

  • onLoad :當小程序狀態為READY時發生。 Applet已完成加載,可以接收JavaScript調用了。
  • onStop :當applet停止時發生。
  • onError :在applet狀態為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; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM