使用LoadData时在WebView中运行Javascript

时间:2011-10-21 10:48:24

标签: java javascript android webview

我是Android Dev的新手,我正在开发我认为简单的应用程序。我有一些存储的HTML代码是原始资源文件夹 - 代码包含一些Javascript。当我在谷歌浏览器中运行代码时它运行正常 - 但是当我使用loadData函数将其加载到webview时,它不会运行Javascript。

我已启用javascript:

mWebView.getSettings().setJavaScriptEnabled(true);

我需要能够在浏览器中运行此Javascript - 任何帮助吗?

5 个答案:

答案 0 :(得分:8)

试试这个:

  

webView.loadDataWithBaseURL(“blarg:// ignored”,getData(),“text / html”,   “utf-8”,“”);

答案 1 :(得分:2)

尝试从代码中调用JS函数。像这样:

mWebView.loadUrl("javascript:myFunction()");

答案 2 :(得分:1)

加载的HTML数据是什么样的?在我的例子中,我生成的原始HTML数据格式为:

<html>
<head>
<style>..</style>
<script>..</script>
</head>
<body>...</body>
</html>

在普通浏览器中测试,事情按预期工作。但是,一旦我使用了WebView.loadData,CSS似乎被识别,但我发现Javascript无法正常工作。

发现对我有用的是将Javascript移动到外部文件(更具体地说,我将我需要的脚本放到资源/使用内容提供商。

<html>
<head>
<link rel="stylesheet" type="text/css" href="content://PATHTOSTYLESHEET" />
<script src="content://PATHTOJS"></script>
</head>
<body>...</body>
</html>

根据What is the difference between Android webview's loadData and loadDataWithBaseURL,如果您设置了存储样式/脚本的正确基本URL,则使用适当的文件://对于您在本地存储的任何内容,这听起来更为简单。

答案 3 :(得分:1)

我正在跟进@ Cobaia上面的回答,另一个(我认为)有用的功能:

由于我需要在测试和调试时不断更改嵌入式HTML,因此我决定在开发页面期间从本地Web服务器获取原始页面,并将其传递给webView,如下所示:

String url, str;

str = getFromURL(url);
webView.loadDataWithBaseURL("blarg://ignored", str, "text/html", "UTF-8", "");

其中getFromURL()定义为:

    public String getFromURL(String urlToRead) {
      URL url;
      HttpURLConnection conn;
      BufferedReader rd;
      String result = "";
      char[] chunk = new char[8192];
      int blen = chunk.length;
      int amt;      

      try {
         url = new URL(urlToRead);
         conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");


         rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
         while ((amt = rd.read(chunk, 0, blen)) > 0) {
             result += new String(chunk, 0, amt);
          }
         rd.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return result;
   }

请注意,我必须创建一个特殊的控制器(我正在使用CodeIgniter)以允许从服务器下载文件作为文本文件。

希望这个暗示也能帮助别人!

答案 4 :(得分:0)

上述解决方案对我不起作用,因为我正在加载一个包含HTML而不是单独的HTML文件的字符串。字符串中的HTML引用了资产/ www /中的JavaScripts。有用的是使用mWv.loadDataWithBaseURL(“file:/// android_asset / www /”,HTML_AS_STRING,“text / html”,“UTF-8”,null);

请参阅下面的完整示例。该示例创建webview,从字符串加载HTML,然后在单独的JavaScript文件中调用函数。该功能只显示警报。

public class MainActivity extends Activity{

    private WebView mWv;

    private static final String HTML_AS_STRING = 
            "<!DOCTYPE html>"                                   +
            "<html>"                                            +
            "<head>"                                            +
            "</head>"                                           +
            "<body>"                                            +

            "<p>Just some text in a paragraph.</p>"             +
            "<div align=\"center\" style=\"color:#0000FF\">"    +
            "<h3>This is a heading in a div element</h3>"       +
            "<p>This is some text in a div element.</p>"        +
            "</div>"                                            +

            "<font size=\"4\" color=\"0000FF\">"                +
            "This is some sized and colored text."              +
            "</font>"           
                                                                +
            "<script src=\"index.js\"></script>"                +

            "</body>"                                           +
            "</html>";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        mWv = (WebView)findViewById(R.id.webview);      
        mWv.getSettings().setJavaScriptEnabled(true);

        mWv.setWebViewClient(new WebViewClient(){
            @Override  
            public void onPageFinished(WebView view, String url){  
                mWv.loadUrl("javascript:showAlert()");
            }  
        });
        mWv.setWebChromeClient(new WebChromeClient());

        mWv.loadDataWithBaseURL("file:///android_asset/www/", HTML_AS_STRING, "text/html", "UTF-8", null);      
    }
}

index.js(assets / www /中的单独文件):

function showAlert() {
    alert("A simple alert!");
}