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

IT技术 javascript android click webview
2021-02-01 07:58:42

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

我最后有一个许可证文本 2 个按钮。所有这些都是用 HTML 写成的,WebView因为许可证中有一些链接。现在,我想的是,当用户点击“确定”按钮WebView,这会触发一些JavaScript或听众,我可以在Java抢火一个Intent前进中的应用。(取消按钮会做相反的事情,但如果我知道如何做一个,我可以做另一个。;))

这是否给某人敲响了警钟?欢迎任何解释或示例代码。

6个回答

经过一番阅读,我终于自己掌握了它。当您对 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>

我将点击事件发送到 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>

valid并且refuse是我通过 javascript 接口传递的 2 个 java 对象以使用它们的方法。因此,在 Java 中,我创建了 2 个按钮(并未真正显示在 Activity 中,仅在此处显示它们的方法,并且是 HTML 按钮的某种阴影:

valid = new Button(ctx);
valid.setOnClickListener(this);
refuse = new Button(ctx);
refuse.setOnClickListener(this);

然后我将 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");

最后,在 onClick 方法中处理点击事件:

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

希望这会帮助一些人

@Sephy 这在 Android 2.3 中不起作用。我有什么方法可以实现这个吗?
2021-03-20 07:58:42
@Sephy:我假设这里的对象应该有一个点击监听器,函数的名称并不重要,Ami 对吧?或者说它简单的 performClick 可以替换为任何文本?
2021-03-23 07:58:42
这里有人吗?它也不适用于 4.1 和 4.2。请帮忙
2021-03-24 07:58:42
不在资产文件夹中的远程 url 怎么样,如何从中获得点击
2021-03-28 07:58:42
@Sephy 你能解释一下什么是有效的,拒绝是按钮还是 JavaWebInterface 对象?而 onclick 方法是因为你已经实现了 onclick 监听器或类似的东西?很抱歉,我无法运行上面的代码。请帮忙。谢谢
2021-04-10 07:58:42

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

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

然后在 HTML 中,直接从 button 标签调用它:

<button type="button" onclick="ok.performClick();">OK</button>
重要的!对于设备 api 级别 17+ 不要忘记添加“@JavascriptInterface”注释。来自developer.android.com/guide/webapps/webview.html 警告:如果您已将 targetSdkVersion 设置为 17 或更高,则必须将“@JavascriptInterface”注释添加到您希望可用于 JavaScript 的任何方法(方法也必须是公开的)。如果您不提供注释,则在 Android 4.2 或更高版本上运行时,您的网页将无法访问该方法。
2021-03-16 07:58:42
在我看来和我的完全一样,虽然只有一个按钮。请注意,我会将 javascript 界面绑定到一个按钮而不是一个简单的对象,这样您就可以受益于按钮周围的整套方法和内容!
2021-03-20 07:58:42
我试过但不适合我。请参阅 stackoverflow.com/questions/20917235/...
2021-03-20 07:58:42
无法添加 javascriptInterface
2021-03-27 07:58:42
peastman 的方法实际上更好,至少在语义上是这样。绑定到Button遗嘱会诱使人们认为他们之间存在联系,但事实并非如此。代码不关心您是否将 JavaScript 绑定到 aButton或 aBitmap或普通Object它会调用你告诉它的任何函数。您无法访问额外的方法。例如,调用setText()JavaButton对象不会更改 HTML 按钮的文本。
2021-04-09 07:58:42

如果您还想检索按钮值。

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");

HTML:

<button type="button" value="someValue" onclick="ok.performClick(this.value);">OK</button>
这个名称“performClick”在 java 和 javascript 中是否必须相同?
2021-03-16 07:58:42
@user1530779 是的,因为它是 Object 函数的名称
2021-03-27 07:58:42
这个名称“performClick”在 java 和 javascript 中是否必须相同?
2021-04-01 07:58:42
    WebView browser = new WebView(this);
    browser.getSettings().setJavaScriptEnabled(true);
    browser.loadUrl("file:///android_asset/page.html");
    setContentView(browser);
    WebSettings ws = browser.getSettings();
    ws.setJavaScriptEnabled(true);
    browser.addJavascriptInterface(new Object()
    {
        @JavascriptInterface           // For API 17+
        public void performClick(String strl)
        {

            Toast.makeText (MainActivity.this, strl, Toast.LENGTH_SHORT).show();

        }
    }, "ok");

page.html 文件

<html>
<body>

    First name: <input type="text" name="fname" id="txtfname"><br>
    Last name: <input type="text" name="lname" id="txtlname"><br>

    <script>
    function getValues() {
    document.getElementById("btnOK").value = document.getElementById("txtfname").value+" "+document.getElementById("txtlname").value;
    }
    </script>

    <button type="button" value="" id="btnOK" onclick="getValues();ok.performClick(this.value);">OK</button>
</body>
</html>

<b><button type = "button" value = "print" onclick="ok.performClick(this.value)" id="ok">PRINT</button></b>


webView.addJavascriptInterface( new Object() {
        @JavascriptInterface // For API 17+
        public void performClick (String strl) {
            //performClick 
        }
    } , "ok" ) ;