2015-09-08 75 views
0

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

我用下面的代码加载.js文件。

11月9日至8日:43:28.195:

InputStream is=mContext.getResources().openRawResource(R.raw.webviewjavascriptbridge); 
String script=convertStreamToString(is) 
webView.loadUrl("javascript:"+script); 
当执行上面的代码中LOCAT打印

d/WebViewJavascriptBridge ---(27080):未捕获的SyntaxError:非法return语句行: 2

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

任何帮助表示赞赏。

回答

0

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

if (window.WebViewJavascriptBridge3) { 
    return; 
} 

这个片段包含一个函数之外的return声明。这是ECMAScript标准所不允许的,最近版本的V8开始拒绝这样的代码。也许,你应该用throw替换你的return声明。

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

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 
}})(); 
-1

比较原始代码,你失去了下面的代码,它如何正确运行?

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