我正在尝试通过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
如果我做错了,请纠正我。
任何帮助表示感谢。
答案 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);