Я понимаю, что это действительно старый вопрос, но он занял 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();
}