JavaScript对象未通过android webview加载

时间:2015-09-08 06:16:09

标签: javascript android webview

我正在尝试通过android的webview加载.js文件(WebViewJavascriptBridge.js)。我将.js文件放在原始文件夹中并尝试加载它。 .js文件位于以下链接中。 https://github.com/SocketCluster/socketcluster-client-android/blob/master/socketclusterandroidclient/src/main/assets/webviewjavascriptbridge.js

我使用以下代码加载.js文件。

-ibck

执行上述代码时,它会在locat中打印:

09-08 11:43:28.195:D / WebViewJavascriptBridge ---(27080):Uncaught SyntaxError:非法返回语句行:2

如果我做错了,请纠正我。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:0)

我认为错误是指以下代码片段:

if (window.WebViewJavascriptBridge3) {
    return;
}

此片段在函数外部包含return语句。 ECMAScript标准不允许这样做,最近版本的V8开始拒绝这样的代码。也许,您应该将return语句替换为throw

现在,下一个问题是为什么会返回此返回语句 - 因为没有WebViewJavascriptBridge3注入到您的页面中。你能否展示配置WebView的代码,注入对象并加载页面?请注意,在调用addJavascriptObject函数后,所有注入的Java对象仅在下次加载时可见。

答案 1 :(得分:0)

我对脚本进行了一些小改动,但效果很好。

(function()
{
if (window.WebViewJavascriptBridge3) {
    return;
}


var messageHandlers = {};
var responseCallbacks = {};
var uniqueId = 1;

function init(messageHandler) {
    if (WebViewJavascriptBridge3._messageHandler) {
        throw new Error('WebViewJavascriptBridge3.init called twice');
    }
    WebViewJavascriptBridge3._messageHandler = messageHandler;
}

function _doSend(message, responseCallback) {
    console.log("responseCallback:" + responseCallback);
    if (responseCallback) {
        var callbackId = 'cb_' + (uniqueId++) + '_' + new Date().getTime();
        responseCallbacks[callbackId] = responseCallback;
        message['callbackId'] = callbackId;
    }
    console.log("sending:" + JSON.stringify(message));
    _WebViewJavascriptBridge._handleMessageFromJs(message.data || null, message.responseId || null,
        message.responseData || null, message.callbackId || null, message.handlerName || null);

}

function send(data, responseCallback) {
    _doSend({data: data}, responseCallback);
}

function registerHandler(handlerName, handler) {
    messageHandlers[handlerName] = handler;
}

function callHandler(handlerName, data, responseCallback) {
    _doSend({handlerName: handlerName, data: data}, responseCallback);
}



function _dispatchMessageFromJava(messageJSON) {
    var message = JSON.parse(messageJSON);
    var messageHandler;

    if (message.responseId) {
        var responseCallback = responseCallbacks[message.responseId];
        if (!responseCallback) {
            return;
        }
        responseCallback(message.responseData);
        delete responseCallbacks[message.responseId];
    }
    else {
        var responseCallback;
        if (message.callbackId) {
            var callbackResponseId = message.callbackId;
            responseCallback = function(responseData) {
                _doSend({
                    responseId: callbackResponseId,
                    responseData: responseData
                });
            };
        }

        var handler = WebViewJavascriptBridge3._messageHandler;
        if (message.handlerName) {
            handler = messageHandlers[message.handlerName];
        }
        try {
            handler(message.data, responseCallback);
        } catch(exception) {
            if (typeof console !='undefined') {
                console.log("WebViewJavascriptBridge3: WARNING: javascript handler threw.", message, exception);
            }
        }
    }
}

function _handleMessageFromJava(messageJSON) {
    _dispatchMessageFromJava(messageJSON);
}
window.WebViewJavascriptBridge3 = {
    'init': init,
    'send': send,
    'registerHandler': registerHandler,
    'callHandler': callHandler,
    '_handleMessageFromJava': _handleMessageFromJava
}})();

答案 2 :(得分:-1)

比较原始代码,您丢失了以下代码,它是如何正确运行的?

//dispatch event
var doc = document;
var readyEvent = doc.createEvent('Events');
readyEvent.initEvent('WebViewJavascriptBridgeReady');
readyEvent.bridge = WebViewJavascriptBridge;
doc.dispatchEvent(readyEvent);