如何通过WebView与JavaScript将Java变量填入外部网站输入框
问题分析与解决方案
你的核心问题有两个:
- 误用了JSP模板语法
<%= drug1 %>——这是Java Web端的模板语法,Android原生Java代码根本不会解析它,导致JS代码里实际是把<%= drug1 %>当成了字面量,而不是你定义的Java变量值。 - JS字符串必须用引号包裹——你硬编码时加了单引号
'isotretinoin'是正确的,但尝试的其他写法都没给变量值加引号,JS会把它识别为未定义的变量,而非字符串。
正确实现方式
方式1:直接字符串拼接(简单场景)
把Java变量用引号包裹后,直接拼入JS代码字符串中:
String drug1 = "tetracycline"; webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String weburl){ // 用单引号包裹drug1,拼入JS代码 String setValueJs = "javascript:document.getElementById('livesearch-interaction-basic').value = '" + drug1 + "'; null"; webView.loadUrl(setValueJs); webView.loadUrl("javascript:document.getElementsByTagName('input')[2].click()"); } });
注意:如果drug1包含单引号,会导致JS语法错误,此时可以改用双引号包裹,同时转义Java中的双引号:
String setValueJs = "javascript:document.getElementById('livesearch-interaction-basic').value = \"" + drug1 + "\"; null";
方式2:使用evaluateJavascript(推荐,Android 4.4+)
evaluateJavascript是比loadUrl更高效的JS交互方式,还能更安全地处理字符串:
String drug1 = "tetracycline"; webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String weburl){ webView.evaluateJavascript( // 合并JS操作,减少调用次数 "document.getElementById('livesearch-interaction-basic').value = '" + drug1 + "'; document.getElementsByTagName('input')[2].click();", null // 不需要回调结果时传null ); } });
方式3:安全转义特殊字符(复杂场景)
如果drug1可能包含引号、换行等特殊字符,用JSONObject自动转义字符串,避免JS语法错误:
import org.json.JSONObject; // ... String drug1 = "tetracycline"; // 自动转义特殊字符 String escapedDrug = new JSONObject().put("drug", drug1).getString("drug"); webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String weburl){ webView.evaluateJavascript( "document.getElementById('livesearch-interaction-basic').value = " + escapedDrug + "; document.getElementsByTagName('input')[2].click();", null ); } });
另外补充:你之前的代码里给onPageFinished加了@JavascriptInterface注解是错误的——这个注解是给Java方法标记为可被JS调用的,而onPageFinished是WebViewClient的回调方法,不需要这个注解。
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

