如何在Java Applet中注册JavaScript回调?

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这样做.

Phi*_*Lho 2

我对 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)