我有一个使用<applet>
标记中定义的java applet的Web应用程序。是否可以添加applet完全加载后触发的javascript事件?这是一些初始化javascript,它取决于applet是否已完全加载且有效。
答案 0 :(得分:5)
javascript调用相当简单:
你的init()方法可以包含jsObject声明和javascript调用:
@Override
public void init() {
// some code
JSObject jsObject = JSObject.getWindow(this);
jsObject.eval("your javascript");
}
答案 1 :(得分: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.");
});
答案 2 :(得分:2)
你在java applet中有一个初始化函数(我认为它已运行)。从那里,您可以在初始化工作后在网页中调用javascript。 要工作,您必须将MAYSCRIPT属性添加到您的applet定义
<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
答案 3 :(得分:2)
您可以使用param
标记将JS函数的名称传递到您的applet中:
<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
archive="Applet.jar" MAYSCRIPT>
<param name="applet_ready_callback" value="myJSfunction"/>
</applet>
在applet中,获取param的值并在准备就绪时调用该函数:
@Override
public void init() {
String jsCallbackName = getParameter("applet_ready_callback");
JSObject jsObject = JSObject.getWindow(this);
jsObject.eval(jsCallbackName + "()");
}
答案 4 :(得分:0)
我用另一种方法从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函数。
答案 5 :(得分:0)
Java 7 SE是可行的。您可以注册onLoad()
个活动或仅轮询status
,请参阅Handling Initialization Status With Event Handlers以获取示例。
要使用此功能,您应该将java_status_events
参数设置为true
来部署小程序。
文章Applet Status and Event Handlers概述了状态和事件:
状态
LOADING
= 1 - 小程序正在加载READY
= 2 - Applet已完全加载并准备接收JavaScript调用ERROR
= 3 - 加载小程序时出错活动
onLoad
:小程序状态为READY
时发生。 Applet已完成加载并准备接收JavaScript调用。onStop
:小程序停止时发生。onError
:小程序状态为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;