2015-09-08 113 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);