javascript - 使用 WebView 将按钮文本从 Javascript 返回到 Java

标签 javascript java android webview

我需要阅读网站上按钮上的文本。我尝试使用 JSOUP 解析页面,但 JSOUP 没有看到 Javascript 对象。这就是为什么我决定使用 WebView 来读取文本。但这不起作用。我需要将按钮文本从 Javascript 返回到 Java。是否可以?

 public class MainActivity extends AppCompatActivity {

    WebView mWebView;
    Button mButton, mClick;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.web_view);
        mButton = (Button) findViewById(R.id.start_URL);
        mClick = (Button) findViewById(R.id.click);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.getSettings().setJavaScriptEnabled(true);
                mWebView.getSettings().setUseWideViewPort(true);
                mWebView.getSettings().setLoadWithOverviewMode(true);
                mWebView.getSettings().setDomStorageEnabled(true);
                mWebView.setWebViewClient(new PersonalWebView());
                mWebView.setWebChromeClient(new PersonalWebChrome());
                mWebView.addJavascriptInterface(new JSInterface(), "JSInterface");
                mWebView.loadUrl(URL);

             mClick.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                 mWebView.loadUrl("javascript: window.JSInterface.callFromJS('buttonText')");}
    }

    private class JavaScriptInterface {

        @JavascriptInterface
        public void callFromJS(String buttonText) {
            Log.d("JScript","callFromJS "+ buttonText);
        }
    }

    private class PersonalWebView extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }
        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }
    }


    private class PersonalWebChrome extends WebChromeClient {

        private PersonalWebChrome() {
            super();
        }

        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            return super.onJsAlert(view, url, message, result);
        }
    }     
      @Override                                                                                  
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        Log.d("TAG", consoleMessage.message()+" "+consoleMessage.sourceId());
        return super.onConsoleMessage(consoleMessage);
    }
}

我尝试更改代码,但不起作用:

    mClick.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 mWebView.addJavascriptInterface(new JSInterface(), "JSInterface");
                 ValueCallback<String> result = new ValueCallback<String>() {
                     @Override
                     public void onReceiveValue(String value) {
                         Log.d("TAG", value);
                     }
                 };                                                     
  mWebView.evaluateJavascript("javascript: window.JSInterface.callFromJS('buttonText')",result);}}     

在日志中我看到:

D/TAG: Uncaught TypeError: Cannot read property 'callFromJS' of undefined

最佳答案

不是处理注入(inject) Java 对象的正确方法:

mWebView.addJavascriptInterface(new JavaScriptInterface(), "javaCallback");
mWebView.loadUrl("javascript:window.javaCallback.callFromJS('buttonText')";

注入(inject)的对象仅在调用addJavascriptInterface后在下一页加载时变得“可见”。加载 javascript: URI 不算作页面加载。

查看the sample from the docs :

webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");

中间的loadData实际上是让对象被插入的。您也可以使用 loadUrl 但它需要是一个真实的页面(来自网络、 Assets 、about:blank 等),而不是 javascript: URI。

关于javascript - 使用 WebView 将按钮文本从 Javascript 返回到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946358/

相关文章:

java - 不使用任何循环对 ArrayList 元素进行操作

java - 有没有办法在 Lucene 中将首字母缩略词与其扩展名相匹配?

java - 子类 OOP 的限制

java - PullToRefresh 与自定义单元格 listView Android

javascript - Canvas 到 Blob 质量

javascript - 尝试从选择选项将数据拉入表中

android - 您的应用不符合 Google Play 政策 SPLIT_BUNDLE 12 : Policy Declaration Data Safety Section: Location

安卓菜单透明

javascript - 如何在 Google map 中添加我的位置按钮?

javascript - 使用 jquery 日期选择器减去日期