You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android WebView页面加载完成前注入JavaScript类

实现WebView页面加载前注入JavaScript类

要让你的网站在WebView中正常运行,必须在页面脚本执行前注入MySuperClass类,具体实现步骤如下:

1. 准备JavaScript类代码

把Chrome扩展里的MySuperClass逻辑提取出来,整理成可注入的代码。可以直接写成字符串,或者放到assets/js/mysuperclass.js文件中(更便于维护)。

示例JS代码(类对象形式):

var MySuperClass = {
    updateSomething: function() {
        // 原Chrome扩展中的方法实现
        console.log("updateSomething 被调用");
    },
    somethingElse: function(data) {
        // 原Chrome扩展中的方法实现
        console.log("somethingElse 被调用,参数:" + data);
    }
};

2. 修改Android代码注入JS

在你的MainActivity中,添加JS注入逻辑,关键是在页面开始加载时注入,确保网站脚本执行前MySuperClass已存在。

方式一:直接用字符串注入

修改WebViewClient,重写onPageStarted方法:

public class MainActivity extends AppCompatActivity {

    // 定义要注入的JavaScript代码
    private static final String MY_SUPER_CLASS_JS = "var MySuperClass = {" +
            "updateSomething: function() {" +
            "   console.log('updateSomething 被调用');" +
            "   // 替换为你扩展中的实际逻辑" +
            "}, " +
            "somethingElse: function(data) {" +
            "   console.log('somethingElse 被调用,参数:' + data);" +
            "   // 替换为你扩展中的实际逻辑" +
            "}" +
            "};";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView.setWebContentsDebuggingEnabled(true);

        WebView myWebView = findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setSupportMultipleWindows(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                // 错误处理逻辑
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.d("WebView", "页面加载完成:" + url);
                super.onPageFinished(view, url);
            }

            // 关键:页面开始加载时注入JS
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                // 根据API版本选择注入方式
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    view.evaluateJavascript(MY_SUPER_CLASS_JS, null);
                } else {
                    view.loadUrl("javascript:" + MY_SUPER_CLASS_JS);
                }
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.d("WebView", "点击链接:" + url);
                return super.shouldOverrideUrlLoading(view, url);
            }
        });
        myWebView.loadUrl("https://mysiteurl.com/");
    }
}

方式二:从assets文件加载JS(推荐,代码量大时更易维护)

先在assets目录下创建js/mysuperclass.js文件,放入你的JS代码,然后添加读取方法:

private String loadJSFromAssets() {
    try {
        InputStream is = getAssets().open("js/mysuperclass.js");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        return new String(buffer, StandardCharsets.UTF_8);
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
}

然后在onPageStarted中替换为:

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    String jsCode = loadJSFromAssets();
    if (!jsCode.isEmpty()) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            view.evaluateJavascript(jsCode, null);
        } else {
            view.loadUrl("javascript:" + jsCode);
        }
    }
}

3. 验证效果

开启WebView调试(你已添加WebView.setWebContentsDebuggingEnabled(true);),在电脑Chrome浏览器中打开chrome://inspect,找到你的WebView实例,打开DevTools后在控制台输入MySuperClass,确认对象存在,调用MySuperClass.updateSomething()测试是否正常执行。

内容的提问来源于stack exchange,提问作者Maco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:16:02