Передача анонимной функции JavaScript в качестве параметра в WebView
У меня есть родное приложение, в котором есть WebView. Я добавляю класс в WebView, чтобы иметь возможность вызывать его из JavaScript следующим образом:
webView.addJavascriptInterface(new JavascriptInterface(webView, handler), "Android.JSI");
Затем я вызываю класс JavaScriptInterface из JavaScript. Мой HTML/JavaScript выглядит так:
<input type="button" value="Sleep Alert" onclick="sleepAlert(sleepAlertCallbackSuccess, sleepAlertCallbackFail, 'Hi Sleep Alert');" />
function sleepAlert(callBackSuccess, callBackFailure, message)
{
window.Android.JSI.sleepAlert(callBackSuccess.name, callBackFailure.name, message);
}
function sleepAlertCallbackSuccess(message)
{
alert("success: " + message);
}
function sleepAlertCallbackFail(message)
{
alert("fail: " + message);
}
Затем я перезваниваю в JavaScript так:
js = "javascript:" + callbackSuccess + "('" + message + "')";
webView.loadUrl(js);
Это работает, но я немного застрял, если пользователь хочет передать анонимную функцию вместо обычной именованной функции. IE
<input type="button" value="Anonymous call back" onclick="sleepAlert(function(message) { alert(message); }, sleepAlertCallbackFail, 'anonymous sleep alert');" />
Когда я передаю это в мой класс Java
public void sleepAlert(final String callbackSuccess, String callbackFail, final String message)
Он говорит, что callbackSuccess не определен.
Есть какие-нибудь идеи о том, как сделать это, так как я чувствую, что я заблудился, идя по неверному пути?
1 ответ
Установите его в переменную. Вы можете сделать что-то вроде:
var a = <whatever>; a(message);
Тогда, если это метод, он разрешит:
var a = sleepAlertCallbackSuccess; a(message);
или если это анонимно:
var a = function(message) { ... }; a(message);
Поскольку вы передаете его в адресной строке, вам придется кодировать его по URI и т. Д., Но подход должен работать.
Обновить:
Вот что-то вроде того, что я имею в виду:
js = "javascript: var a=" + callbackSuccess + ";a(message);";
String url = "javascript:" + Uri.encode(js);
webView.loadUrl(url);
Теперь вы можете дать ему что-то вроде "function(message) { alert(message); }", и оно будет работать. Кстати, я бы очень осторожно позволил пользователю запускать здесь произвольный код. Трудно сказать, не видя больше, но такого рода вещи могут довольно легко обнажить дыры в безопасности.