我有一个使用在<applet>
标签中定义的java applet的Web应用程序。是否可以添加一个JavaScript事件,在applet完全加载后触发?这是一些初始化JavaScript,它依赖于applet完全加载并有效。
我有一个使用在<applet>
标签中定义的java applet的Web应用程序。是否可以添加一个JavaScript事件,在applet完全加载后触发?这是一些初始化JavaScript,它依赖于applet完全加载并有效。
Javascript调用非常简单:
您的init()方法可以包括jsObject声明和Javascript调用:
@Override
public void init() {
// some code
JSObject jsObject = JSObject.getWindow(this);
jsObject.eval("your javascript");
}
/* 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.");
});
to
的值是“object”。而Firefox则在此处给出“function”。我只是更改了检查以支持两者:if (to == 'function' || to == 'object')
。 - awetypeof (document.getElementById(applet_id))
总是_object_即使id不存在!!所以它实际上并没有检查任何东西。对我来说它总是成功回调。 - rolgalan您在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
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 + "()");
}
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;
我使用了另一种方法从小程序中调用JavaScript函数。
try {
getAppletContext().showDocument(new URL("javascript:appletLoaded()"));
} catch (MalformedURLException e) {
System.err.println("Failed to call JavaScript function appletLoaded()");
}
...必须在扩展了Applet或JApplet的应用程序类中调用。我在我的start()方法的末尾调用了JavaScript函数。