Tad*_*der 10 javascript java methods applet callback
我正在开发一个不可见的Java Applet,它将完全由JavaScript控制.
我可以轻松地调用applet的Java方法,并且可以通过使用来调用applet中的JavaScript方法netscape.javascript.JSObject.getWindow(this).call().
但是为了在applet中注册一个JavaScript回调,我想我需要某种JavaScript函数对象.
我想要做:
public void registerCallback( SomeJavascriptFunction func ) { ... }
Run Code Online (Sandbox Code Playgroud)
我可以通过Javascript调用:
myapplet.registerCallback(function(){ alert("called back"); });
Run Code Online (Sandbox Code Playgroud)
所以我可以在以后的代码中调用这个函数:
func.call( ... );
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?我怎样才能做到这一点?
Rigth现在我正在考虑创建一些Javascript来处理这个回调机制而不是从applet这样做.
我对 Java <-> JavaScript 通信是全新的,因为我计划本周进行探索。这是一个很好的机会...:-)
经过一些测试,似乎无法将 JS 函数传递给 Java 小程序。除非我以错误的方式做...
我试过:
function CallJava()
{
document.Applet.Call("Does it work?");
document.Applet.Call(function () { alert("It works!"); });
document.Applet.Call(DoSomething); // A simple parameterless JS function
document.Applet.Call(window.location);
}
function DumbTest(message, value)
{
alert("This is a dumb test with a message:\n" + message + "\n" + value);
}
Run Code Online (Sandbox Code Playgroud)
其中 Call 定义为:
public void Call(String message)
{
JSObject win = (JSObject) JSObject.getWindow(this);
String[] arguments = { "Call with String", message };
win.call("DumbTest", arguments);
}
public void Call(JSObject jso)
{
JSObject win = (JSObject) JSObject.getWindow(this);
String[] arguments = { "Call with JSObject", jso.toString() };
win.call("DumbTest", arguments);
}
Run Code Online (Sandbox Code Playgroud)
当我传递 JS 函数(FF3 中的所有测试)时,我在 Java 端得到一个 null。
请注意,以下 Java 例程允许显示 DumberTest 函数的 JS 代码!
public int Do()
{
JSObject win = (JSObject) JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject fun = (JSObject) win.getMember("DumberTest");
JSObject loc = (JSObject) doc.getMember("location");
String href = (String) loc.getMember("href");
String[] arguments = { href, fun.toString() };
win.call("DumbTest", arguments);
return fun.toString().length();
}
Run Code Online (Sandbox Code Playgroud)
重点是:我做了一个 JS 函数:
function RegisterCallback(cbFunction)
{
var callback = cbFunction.toString(); // We get JS code
var callbackName = /^function (\w+)\(/.exec(callback);
document.Applet.RegisterCallback(callbackName[1]);
}
Run Code Online (Sandbox Code Playgroud)
我从 toString 结果中提取 JS 函数的名称并将其传递给 Java 小程序。我不认为我们可以处理匿名函数,因为 Java 通过名称调用 JS 函数。
Java端:
String callbackFunction;
public void RegisterCallback(String functionName)
{
callbackFunction = functionName;
}
void UseCallbackFunction()
{
if (callbackFunction == null) return;
JSObject win = (JSObject) JSObject.getWindow(this);
win.call(callbackFunction, null);
}
Run Code Online (Sandbox Code Playgroud)