2012-01-17 77 views
2

我想打電話給它在HTML 定義如下從Java的Android WebView中調用jQuery函數?

WebView.loadUrl("javascript:hoge()"); 

我可以叫非jQuery函數javascript函數,但我不能把我的「$(文件)中定義的功能。 ready(function(){})(jQuery);',就像下面這樣。

<script> 
//I can call this function by webview.loadUrl("javascript:something()"); 
function something(){ 
    //do something 
} 

$(document).ready(function(){ 
    //but I can't call this function by webview.loadUrl("javascript:hoge()"); 
    function hoge(){ 
     //do something. 
    } 
})(jQuery); 
</script> 

有沒有辦法從Java調用hoge()像普通的javascript函數?

我發現我可以使用jQuery Selector,即使函數不在'$(document).ready(function(){})(jQuery);'中,但我也發現使用該解決方法,我可以不使用額外的jQuery庫。

belllow是實際代碼。

https://github.com/YoshimuraSei/AndrOutliner/tree/master/Outliner

,這是HTML文件 https://github.com/YoshimuraSei/AndrOutliner/blob/master/Outliner/assets/www/treeview.html

,這是我想調用JavaScript函數的Java代碼。我試圖調用JavaScript function'test1()'(見html34文件的第34行),它可以被調用,因爲它目前不在'$(document).ready()函數(){})(jQuery);',但我不能從test1()中調用額外的jQuery庫方法'nestedSortable()'。

我該如何解決這個問題?

編輯:
或者這只是加載jQuery庫和插件的時機?
加載html到webview後,我得到了這些錯誤。

Uncaught TypeError: Cannot read property 'mouse' of undefined--From line 7 of file:///android_asset/www/js/jquery.ui.mouse.touch.js 
Uncaught TypeError: Cannot read property 'sortable' of undefined--From line 15 of file:///android_asset/www/js/jquery.ui.nestedSortable.js 

「老鼠」和「排序」是jquery.ui,裝載這2個文件前應加載的屬性,所以我認爲加載順序是有點怪。 有什麼想法?

回答

0

你可以做的是在你調用webview(例如method = hoge)時傳遞一個查詢字符串參數。

然後在你的JavaScript可以檢查帕拉姆是否存在等,如果你有興趣的運行hoge()方法相應

不知道,但你也可以從JavaScript的使用了Android的JavaScript接口調用你的Android的Java代碼,請參閱http://developer.android.com/guide/webapps/webview.html

+0

謝謝你的回答。你的意思是,每當我想使用方法時,我必須重新加載html,對吧? – yshrsmz 2012-01-18 04:15:29

+0

問題解決了。問題是一個錯字。並感謝您有關Android的JavaScript界面​​的信息。我找到了將JavaScript函數返回值傳遞給Java代碼的方法。 – yshrsmz 2012-01-19 08:30:55

0

好吧,您可以隨時使用webView的loadUrl方法調用javascript函數;

myWebView.loadUrl("Javascript: alert('test');"); 
1

我目前是一名JavaScript工程師。從這個經驗中,現在我可以看到什麼是錯的。 這是一個範圍&時間相關的問題。
$(document).ready(function(){});內部的函數不能從外部調用,因爲它們不是全局的。如果你想從外面打電話給他們,你必須把它變成全球性的。你必須等到JavaScript完全加載並準備好使用。

$(document).ready(function(){ 
    // make it global function 
    window.foo = function(){ 
     //do something. 
    } 

    // call java method that notifies java that js is ready to use. 
    // (you should implement JavascriptInterface class & method) 
    window.JsInterface.jsReady(); 
})(jQuery); 
  1. 你不得不暴露功能全球
  2. 你必須等到javascript準備好。
+0

這解釋了很多。我注意到,如果我也將該函數放入主HTML頁面(第一個由loadUrl()加載的頁面),則第二個loadUrl()javascript調用可以找到該函數。但是,如果我將該功能移入.js文件,它將停止工作。 – 2014-08-29 01:28:39

+0

@ MichaelR.Hines未經測試,但這將有助於:http://stackoverflow.com/a/17041561/855599 – yshrsmz 2014-09-02 05:13:43