通过Android WebView中的javascript检测点击HTML按钮

Sep*_*phy 37 javascript android click webview

我对javascript不是很熟悉,但我认为这是实现目标的最佳方式.如果没有,请纠正我.

我在最后有一个许可文本2按钮.所有这些都是用HTML编写的,WebView因为许可证中有一些链接.现在,我希望当用户点击其中的"确定"按钮时WebView,这会触发一些我可以用Java抓取的javascript或监听器来触发Intent应用程序中的前进.(取消按钮会相反,但如果我知道如何做,我可以做另一个.;))

这会给某人敲响吗?欢迎任何解释或示例代码.

Sep*_*phy 60

经过一番阅读后,我终于得到了它.当你对javascript一无所知以及文档在这个主题上相当薄时,有点难.
这是我的解决方案,希望这会有助于其他人:

使用包含2个按钮的HTML页面,如下所示:

<div>
     <button type="button" id="ok" style="font-weight: 700; margin-right: 20px;" onclick="validClick();">J'accepte</button>
     <button type="button" id="no" onclick="refuseClick();">Je refuse</button>
</div>
Run Code Online (Sandbox Code Playgroud)

我将点击事件发送到HTML页面顶部的javascript:

<script language="javascript">

   function validClick()
   {
      valid.performClick();
      document.getElementById("ok").value = "J'accepte";
   }
   function refuseClick()
   {
      refuse.performClick();
      document.getElementById("no").value = "Je refuse";
   }

</script>
Run Code Online (Sandbox Code Playgroud)

valid并且refuse是我通过javascript接口传递以使用其方法的2个java对象.所以在java中,我创建了2个按钮(实际上并没有真正显示在Activity中,只是在这里用于他们的方法,并且是HTML按钮的阴影:

valid = new Button(ctx);
valid.setOnClickListener(this);
refuse = new Button(ctx);
refuse.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)

然后我添加了javascript给我WebView:

// Enablejavascript
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
// Add the interface to record javascript events
wv.addJavascriptInterface(valid, "valid");
wv.addJavascriptInterface(refuse, "refuse");
Run Code Online (Sandbox Code Playgroud)

最后,处理onClick方法中的click事件:

@Override
public void onClick(View v) {
    if (v.equals(valid)) {
        //do Something
    } else if (v.equals(refuse)) {
        //do Something else }
}
Run Code Online (Sandbox Code Playgroud)

希望这会对一些人有所帮助

  • @Sephy你能解释什么是有效的,拒绝它们是按钮还是JavaWebInterface对象?而onclick方法是因为你已经实现了onclick监听器或类似的东西?很抱歉,我无法运行上述代码.请帮忙.谢谢 (2认同)
  • 有人吗?它也不适用于4.1和4.2.请帮忙 (2认同)

pea*_*man 40

这是一个更简单的解决方案.在Java端,为每个按钮创建一个监听器.它不需要是任何特定的类,因为将使用反射查找该方法:

WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
  public void performClick()
  {
    // Deal with a click on the OK button
  }
}, "ok");
Run Code Online (Sandbox Code Playgroud)

然后在HTML中,直接从按钮标记中调用它:

<button type="button" onclick="ok.performClick();">OK</button>
Run Code Online (Sandbox Code Playgroud)

  • 重要!对于设备api级别17+不要忘记添加"@JavascriptInterface"注释.来自http://developer.android.com/guide/webapps/webview.html警告:如果您已将targetSdkVersion设置为17或更高,则必须将"@JavascriptInterface"注释添加到您希望的任何方法中JavaScript(该方法也必须是公共的).如果您未提供注释,则在Android 4.2或更高版本上运行时,您的网页无法访问该方法. (8认同)

use*_*943 21

如果您还想检索按钮值.

Java的:

WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
   @JavascriptInterface           // For API 17+
   public void performClick(String strl)
   {
      stringVariable = strl;
      Toast.makeText (YourActivity.this, stringVariable, Toast.LENGTH_SHORT).show();
   }
}, "ok");
Run Code Online (Sandbox Code Playgroud)

HTML:

<button type="button" value="someValue" onclick="ok.performClick(this.value);">OK</button>
Run Code Online (Sandbox Code Playgroud)