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

Android WebView调用JS函数报错:Uncaught ReferenceError: 函数未定义

解决WebView调用JavaScript函数的ReferenceError问题

咱们一步步拆解问题根源,逐个解决:

1. 核心问题:myFunction 不在全局作用域内

你网页里的myFunction是定义在init函数内部的局部函数:

function init() {
    function myFunction(data1,data2) { 
        //执行操作
    } 
}
window.onload = init;

这种情况下,myFunction的作用域被限制在init函数内部,外部(包括Android的JavascriptInterface调用、Chrome控制台)根本找不到它,自然会报ReferenceError。

修复方案:把myFunction挂载到window对象上,让它成为全局可访问的函数:

function init() {
    // 将函数暴露到全局作用域
    window.myFunction = function(data1, data2) { 
        // 这里写你的操作逻辑
        console.log("收到Android传递的参数:", data1, data2);
    } 
}
window.onload = init;

修改后,不管是Chrome控制台还是Android端,都能正常调用这个函数了。

2. Java代码里的两处明显错误

你的WebModelInterface类的setTarget方法存在两个低级错误:

  • 方法参数是int finalI, double value,但你在evaluateJavascript里用了未定义的data1和data2变量;
  • else分支里调用了不存在的setJointPosition函数,而网页里的目标函数是myFunction。

修复后的setTarget方法:

public void setTarget(int finalI, double value){
    String jsCallCode = "myFunction(" + finalI + "," + value + ");";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webView.evaluateJavascript(jsCallCode, null);
    } else {
        webView.loadUrl("javascript:" + jsCallCode);
    }
}

这里统一了函数名称,并且正确使用了方法传入的参数,避免了变量未定义和函数名不匹配的问题。

额外注意点

  • 一定要等网页完全加载完成后再调用setTarget方法,比如在WebViewClient的onPageFinished回调之后执行,避免因为脚本还没初始化完成导致的函数未定义错误;
  • 如果需要传递字符串参数,记得给参数加上引号,比如:String jsCallCode = "myFunction('" + stringParam + "'," + numParam + ");";,否则字符串会被当作变量解析,再次引发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:15