【问题标题】:How can i inject js code in the shown page in a webview?如何在 webview 的显示页面中注入 js 代码?
【发布时间】:2019-07-15 05:10:26
【问题描述】:

假设我在 webview 中加载了谷歌页面,然后我搜索了一些东西,

所以页面发生了变化,并且在这个页面中有一个文本,我想在我的 android 应用程序中使用下面的代码在 textView 中获取它

    webview.loadUrl("javascript:api.getSessionID(document.querySelector(bla bla bla)");

class JSInterface {
        @JavascriptInterface

        public void getSessionID(String id) {

            Toast.makeText(context,id, Toast.LENGTH_LONG).show();
        }

如何在 webview 中显示的页面中注入这个 js,而不是在 webview 中首先加载的页面中,即谷歌搜索页面

Google 只是一个例子,当用户登录帐户时,我试图在 sharedPreferences 中保存会话 ID,这是第二页

注意:我的完整代码中有所有必要的代码,以便注入 js 并从中获取字符串

注意2:如果我重新加载页面,我将退出

感谢任何帮助!

【问题讨论】:

    标签: android webview android-webview


    【解决方案1】:

    你的 WebView 首先,我们必须告诉 WebView 启用 JavaScript 执行:

    webview.getSettings().setJavaScriptEnabled(true);
    

    那么我们必须设置 WebViewClient 才能接收 onPageFinished 事件。

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPag`enter code here`eFinished(view, url);
            webView.loadUrl(
                "javascript:(function() { " +
                    "var element = document.getElementById('hplogo');"
                    + "element.parentNode.removeChild(element);" +
                "})()");
        }
    });
    

    【讨论】:

    • 谢谢你的回答,我没有把完整的代码放在我的问题中,我问在哪里把webView.loadUrl( "javascript:(function() 放在下一页中,我在 webview 中一切正常,onPageFinished 和设置...
    • @MJ in onPageFinished 先检查是否是下一页
    • onPageFinished 将在 webview 中的 url 完全加载时运行,但我要问的是当我进入另一个页面并且我想从该网页获取字符串时,我该怎么做?
    • @MJ,enter another page 是什么意思?什么时候开始加载另一个页面?
    • 第一页是登录页面check website,它将在webview中加载Url,用户登录后,它将重定向到下一个主页,其中有一个会话ID,我明白了在 chrome 控制台中使用 js,但是,我不知道如何在该主页中注入该代码
    【解决方案2】:

    要实现这一点,您可以将 javascript 评估为,

    webview.evaluateJavascript("Your JS here which will return session id",
                        html1 -> Log.i("HTML", html1));//session id will be printed
    

    另外,请确保您已启用 java 脚本以在 webview webView.getSettings().setJavaScriptEnabled(true); 中运行

    编辑

    第二种方法, 如果您想实现一个接口,该接口将在您的网页中提供回调做更改,

    if (typeof YourListener != 'undefined')//check if yourlistner is undefined
                    yourListener.onTextChange('theReturnValue');
                });
    

    在上面的代码中,接口是从网页调用的,就像我们在 android 中一样。只需在“theReturnValue”处应用 JS,您需要从网页返回所需的值。

    然后将该界面添加到webview中,

    webview.addJavascriptInterface(new WebAppInterface(getActivity(), webview), "YourListener");
    

    另外,添加接口为,

    public class WebAppInterface {
    
        Context mContext;
        WebView mView;
    
        /**
         * Instantiate the interface and set the context
         */
        WebAppInterface(Context c, WebView w) {
            mContext = c;
            mView = w;
        }
    
        /**
         * Show a toast from the web page
         */
        @JavascriptInterface
        public void onTextChange(String html) {
            //you will get the callback text here
        }
    }
    

    【讨论】:

    • 如果它不起作用,请告诉我。您可以访问 html 网页进行更改吗?
    • 感谢 niks 的回答,但我没听懂,那么,html1 -> Log.i("HTML", html1) 做什么?我想你不明白我的问题,我知道如何从 js 注入代码中获取字符串,但我正在寻找在 webview 中显示的页面中注入 js 代码,
    • 哦,你可以访问 HTML 网页吗?
    • 不幸的是没有
    • 所以我认为这是你可以注入 JS 的方式,而 HTML 只是你的 JS 的输出。因此,在您的情况下,如果您的 JS 在浏览器上返回一个会话 ID,那么它将通过运行上面的代码返回相同的内容。然后您可以将其设置为文本视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多