是否可以在Android中使用JavaScript代码?

时间:2014-08-18 21:01:15

标签: javascript android webview

在此代码中,Android应用程序打开一个带有WebView的网页,并从HTML中提取标签“body”和“/ body”之间的文本。

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;

public class MainAc extends Activity {

    /** Called when the activity is first created. */
    @SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        WebView webView = (WebView) findViewById(R.id.web);
        TextView text2 = (TextView) findViewById(R.id.text);

        Button infoButton = (Button) findViewById(R.id.b1);
        infoButton.setOnClickListener(new OnClickListener(){
            public void onClick(View view){
                // here is your button click logic, for example running another activity (page)
                startActivity(new Intent(MainAc.this, JavaInterface.class));
            }   
        });







        class Javasc { 
            private TextView t2;       

            public Javasc (TextView i)   
            {
                t2 = i;
            }

            @SuppressWarnings("unused") 

            public void processContent(String ii) 
            { 
                final String content = ii;
                t2.post(new Runnable() 
                {    
                    public void run() 
                    {          
                        t2.setText(content);        
                    }     
                });
            } 
        } 


        webView.getSettings().setJavaScriptEnabled(true); 
        webView.addJavascriptInterface(new Javasc(text2), "INTERFACE"); 
        webView.setWebViewClient(new WebViewClient() { 
            @Override 
            public void onPageFinished(WebView view, String url) 
            { 
                view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);"); 

            } 
        }); 

        webView.loadUrl("http://www.nytimes.com/2014/08/03/sports/basketball/pacers-paul-george-has-surgery-after-badly-injuring-leg.html?ref=sports");
    }

    }

是否可以在android的TextView中使用JavaScript函数提取文本?

例如这个JavaScript函数(或者它可以是需要使用文本的任何其他JS函数)

function myFunction() {
var text = document.body.innerText;
var titles =text.match(/^\n(.+?)\n\n/mg);
 for (var i = 0; i < titles.length; i++) {
   document.write(titles[i] + "<br />" + "<br />");
   }
   }

感谢您的回答:)

3 个答案:

答案 0 :(得分:1)

根据this article,Dalvik VM支持Java的脚本功能(javax.script)。 javax.script支持的主要语言之一,不出所料,是JavaScript。

因此理论上,您可以使用javax.script内容来执行JavaScript代码并获取结果。我认为(也基于那篇文章),你必须包含相关的jar(javax.script不在Android SDK中)。幸运的是,javax.script主要是一组接口,由特定脚本语言的jar实现。

有关使用javax.script运行脚本代码的一些资源:

答案 1 :(得分:0)

您可以使用Rhino来实现这一目标。具体参见 Context.jsToJava

https://vec.io/posts/embed-javascript-in-android-java-code-with-rhino

答案 2 :(得分:-1)

你想对一个文本做一个正则表达式并使用javascript来实现它,当你在java中有一个更快速的API而没有开销时,这是不必要的。

与您的示例相同的是:

http://developer.android.com/reference/java/util/regex/Pattern.html

Pattern p = Pattern.compile("/^\n(.+?)\n\n/mg");
 Matcher m = p.matcher(myTextView.getText());
 while (m.find()) {
     String titles = m.group(1);
     Log.V("TAG", titles);
 }

核心框架或外部库中包含大量其他文本分析解决方案,这些解决方案已针对移动设备和服务器进行了验证。你只需要查阅它,而不是使用你喜欢的更糟糕的API。