2012-01-17 16 views
2

は私がJavaからAndroidのWebViewでjQuery関数を呼び出しますか?

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

私は非jQueryの関数を呼び出すことができますようなHTML で定義されている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> 

普通のjavascript関数のようにJavaからhoge()を呼び出す方法はありますか?

関数が '$(document).ready(function(){})(jQuery);'内になくてもjQuery Selectorを使用できることがわかりましたが、その回避策では追加の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コードです。ライン100上の https://github.com/YoshimuraSei/AndrOutliner/blob/master/Outliner/src/com/yslibrary/android/outliner/TreeViewFragment.java

、私は「(htmlファイルのline34参照)、現在それが内部ではないので、それが呼び出すことができる」)(ジャバスクリプトfunction'test1を呼び出すようにしようとしています$(ドキュメント).ready( function(){})(jQuery); '、しかしtest1()から追加のjQueryライブラリメソッド' nestedSortable() 'を呼び出すことはできません。

どうすればこの問題を解決できますか?

編集:
これはちょうどjQueryライブラリとプラグインを読み込むタイミングですか?
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 

「マウス」と「ソート可能」は、これらの2つのファイルがロードされる前にロードする必要がありますjquery.uiの性質、あるので、私はロード順が少し奇妙であることを前提としています。

答えて

0

あなたができることは、webviewを呼び出すときにクエリ文字列パラメータを渡すことです(例:method = hoge)。

は、その後、あなたのJavaScriptで、あなたはのparamのexistanceを確認することができますし、あなたの興味があればわからないそれに応じ

hoge()メソッドを実行しますが、参照、アンドロイドjavascriptのインターフェースを使用して、JavaScriptからあなたのAndroidのJavaコードを呼び出すことができますhttp://developer.android.com/guide/webapps/webview.html

+0

ありがとうございました。つまり、メソッドを使用するたびにhtmlをリロードする必要があります。 – yshrsmz

+0

問題が解決しました。問題はタイプミスでした。アンドロイドのjavascriptインターフェイスに関する情報をありがとう。私は、Javaコードにjavascript関数の戻り値を渡す方法を発見しました。 – yshrsmz

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. JavaScriptが準備完了するまで待つ必要があります。
+0

それはたくさん説明します。私は、メインのHTMLページ(最初にloadUrl()によってロードされたもの)の中に関数を置くと、2番目のloadUrl()JavaScriptコールがその関数を見つけることができることに気付きました。しかし、私が.jsファイルに関数を移動すると、動作が停止します。 –

+0

@ MichaelR.Hinesはテストされていませんが、これは役立ちます:http://stackoverflow.com/a/17041561/855599 – yshrsmz

関連する問題