是否可以注册java小程序完全加载时触发的javascript事件?
我有一个web应用程序,它使用是否可以注册java小程序完全加载时触发的javascript事件?,java,javascript,events,applet,Java,Javascript,Events,Applet,我有一个web应用程序,它使用标记中定义的java小程序。是否可以添加在小程序完全加载后触发的javascript事件?这是一些初始化javascript,取决于小程序是否已完全加载且有效。您在java小程序中有一个初始化器函数(我认为它正在运行)。在初始化工作完成后,您可以在web页面中调用javascript。 要工作,必须将MAYSCRIPT属性添加到小程序定义中 <applet id="someId" code="JavaApplet.class" codebase="/foo"
标记中定义的java小程序。是否可以添加在小程序完全加载后触发的javascript事件?这是一些初始化javascript,取决于小程序是否已完全加载且有效。您在java小程序中有一个初始化器函数(我认为它正在运行)。在初始化工作完成后,您可以在web页面中调用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
publicstringinvokejavascript(对象调用方,stringcmd)抛出TiNT4Exception{
printDebug(2,“启动JavaScript>>”+cmd+“JavaScript调用相当简单:
init()方法可以包括jsObject声明和javascript调用:
@Override
public void init() {
// some code
JSObject jsObject = JSObject.getWindow(this);
jsObject.eval("your javascript");
}
您可以使用param
标记将JS函数的名称传递到小程序中:
<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
archive="Applet.jar" MAYSCRIPT>
<param name="applet_ready_callback" value="myJSfunction"/>
</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.");
});
我使用另一种方法从小程序调用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()
事件或只轮询状态,请参阅示例
为了使用此功能,您应该在部署小程序时将java\u status\u events
参数设置为true
这篇文章概述了现状和事件:
地位
加载
=1-小程序正在加载
READY
=2-小程序已完全加载并准备好接收JavaScript调用
错误
=3-加载小程序时出错
事件
onLoad
:当小程序状态为READY
时发生。小程序已完成加载并准备好接收JavaScript调用
顶部
:小程序停止时发生
onError
:当小程序状态为错误时发生。加载小程序时出错
您可以在网页的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;
我希望在HTML和/或JavaScript中使用一些机制,比如在标记上设置onload=“init()”或其他什么。但如果不可能,我可能只需要按照您的建议从小程序中应用它……我尝试了这一点,但在MSIE中,to
的值是“object”
。Firefox提供函数“
在这里。我刚刚更改了检查以支持这两个选项:if(to=='function'.\124; to=='object')
。Gracias!我修复了这个示例以帮助脚本kiddies。我刚刚尝试了这个和typeof(document.getElementById(applet\u id))
即使id不存在,也始终是object!!因此它实际上不检查任何内容。它总是落在successCallback上…您使用哪个html元素将小程序嵌入页面?applet/object/embed?我的问题是小程序是第三方,所以我没有权限更改小程序的内部。我只是需要我想知道小程序何时被完全加载,所以我知道何时可以在中调用方法。
// 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;