Передача анонимной функции JavaScript в качестве параметра в WebView - PullRequest
3 голосов
/ 09 января 2012

У меня есть родное приложение, в котором есть 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);

Это работает, но я немного застрял, если пользователь хочет передать анонимную функцию вместо обычной именованной функции. И.Е.

<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 Ответ

1 голос
/ 10 января 2012

Установите его в переменную. Вы можете сделать что-то вроде:

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);}», и оно будет работать. Кстати, я бы очень осторожно позволил пользователю запускать здесь произвольный код. Трудно сказать, не видя больше, но подобные вещи могут довольно легко обнажить дыры в безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...