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
相关产品推荐
相关产品推荐

