从Java调用Android的WebView中的jQuery函数?

时间:2012-01-17 11:38:40

标签: jquery android android-webview

我正在尝试调用html中定义的javascript函数 像

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

我可以调用非jQuery函数,但是我不能调用我在'$(document).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()?

我发现我可以使用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代码。 https://github.com/YoshimuraSei/AndrOutliner/blob/master/Outliner/src/com/yslibrary/android/outliner/TreeViewFragment.java

在第100行,我试图调用javascript function'test1()'(参见html文件的第34行),并且可以调用它,因为它当前不在'$(document).ready(function() {})(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

'mouse'和'sortable'是jquery.ui的属性,应该在加载这两个文件之前加载,所以我假设加载顺序有点奇怪。 任何想法?

4 个答案:

答案 0 :(得分:1)

我目前是一名JavaScript工程师。从这次经历来看,现在我可以看出出了什么问题。 这是一个范围&amp;与时间有关的问题 $(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. 您必须将功能公开给 Global
  2. 你必须等到javascript准备就绪。

答案 1 :(得分:0)

您可以做的是在调用webview时传递查询字符串参数(例如,method = hoge)。

然后在您的javascript中,您可以检查参数的存在并相应地运行hoge()方法

不确定您是否感兴趣,但您也可以使用android javascript界面​​从javascript调用您的android java代码,请参阅http://developer.android.com/guide/webapps/webview.html

答案 2 :(得分:0)

好吧,你总是可以使用webview的loadUrl方法调用javascript函数;

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

答案 3 :(得分:0)

只需将一个jquery函数添加到您的html文件中,并命名为show_main_pop:

function show_main_pop(){
  $('#r_and_h').fadeIn(500);
}

并且在android studio中这样调用此函数:

webframe.loadUrl("javascript: show_main_pop();")