これは本当に古い質問だと思いますが、他の検索の 1 つで 2 位にランクされました。以下は、これを見つけた他の人に役立つと思います。
私は最近、Java アプレットがタスクの完了時に JavaScript にコールバックし、成功時またはエラー時にさまざまな関数を呼び出す必要がある、似たようなことを行いました。最近の傾向にあるように、私のニーズは、他の関数に渡されるパラメーターとして定義された無名関数を呼び出すことでした。これは、クライアント側の JavaScript です。
applet.DoProcessing({
success: function(param) {
alert('Success: ' + param);
},
error: function(param) {
alert('Failed: ' + param);
}
});
他の回答で述べたように、Java は JavaScript メソッドを名前でしか呼び出すことができません。これは、必要に応じて他のメソッドを呼び出すことができるグローバル コールバック メソッドが必要であることを意味します。
function ProcessingCallback(isSuccessful, cbParam, jsObject) {
if (isSuccessful && jsObject.success)
jsObject.success(cbParam);
else if (!isSuccessful && jsObject.error)
jsObject.error(cbParam);
}
この関数は、Java アプレット内から直接呼び出されます。
public void DoProcessing(final Object callbacks) {
//do processing....
JSObject w = JSObject.getWindow(this);
//Call our named callback, note how we pass the callbacks parameter straight
//back out again - it will be unchanged in javascript.
w.call("ProcessingCallback", new Object[]{successful, output, callbacks});
}
必要に応じて使い捨てのものではなく、登録されたコールバックの何らかの形式として使用したい場合は、渡されたパラメーター オブジェクトの参照を無期限に保持できます。
この場合、処理に時間がかかる可能性があるため、実際には別のスレッドをスピンアップします。コールバックはここでも機能します。
public void DoProcessing(final Object callbacks) {
//hold a reference for use in the thread
final Applet app = this;
//Create a new Thread object to run our request asynchronously
//so we can return back to single threaded javascript immediately
Thread async = new Thread() {
//Thread objects need a run method
public void run() {
//do processing....
JSObject w = JSObject.getWindow(app);
//Call our named callback, note how we pass the callbacks parameter
//straight back out again - it will be unchanged in javascript.
w.call("ProcessingCallback", new Object[]{successful, output, callbacks});
}
}
//start the thread
async.start();
}