[英]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.