【问题标题】:WebView: Uncaught ReferenceError: Android is not definedWebView: Uncaught ReferenceError: Android is not defined
【发布时间】:2015-03-14 21:01:53
【问题描述】:

我正在使用代码创建 WebView,而不是通过 XML 布局加载。 webview 似乎已正确创建,但我看到了错误:

W/AwContents( 4564): nativeOnDraw failed; clearing to background color.
I/chromium( 4564): [INFO:CONSOLE(1)] "Uncaught ReferenceError: Android is not defined", 
...

如果我将 WebView 放在我的 XML 布局中,我不会收到这些错误。请注意,如果脚本运行,它会将 onLoadEvent 字段值从“no”更改为“yes。这种情况正在发生,因此显然脚本正在运行。但它没有获取用户名和密码,这表明“Android " 未定义。

我也试过在 webView.loadData(); 之前执行 addView();同样的错误。

这是创建 WebView 的代码:

  @SuppressLint("SetJavaScriptEnabled")
  private void onOk ()
  {
    Log.d ("RegTest", "onOk");
    webView = new WebView (this);
    webView.setLayoutParams (new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));    
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled (true);
    CharSequence cs = readAsset ("input_form");
    webView.loadData (cs.toString(), "text/html", "UTF-8");

    contentView.addView (webView);
  }

这里是“input_form”的片段,它是 WebView 内容的来源:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  ...
  <script type="text/javascript">
    function onLoadValues ()
    {
      document.getElementById ("onLoadEvent").value = "yes";
      document.getElementById ("FullName").value = Android.getFullName();
      document.getElementById ("EmailAddress").value = Android.getEmailAddr(); 
    }
  </script>
</head>

<body onload="onLoadValues()">
  <form name="catwebformform52174" method="post" ...>
    <fieldset>
      <div class="pure-control-group">
        <label for="onLoadValues">onLoadEvent</label>
        <input id="onLoadEvent" name="onLoadEvent" type="text" placeholder="no">
      </div>
      <div class="pure-control-group">
        <label for="FullName">Name</label>
        <input id="FullName" name="FullName" type="text" placeholder="Name">
      </div>
      <div class="pure-control-group">
        <label for="EmailAddress">Email Address</label>
        <input id="EmailAddress" name="EmailAddress" type="email" placeholder="Email Address">
      </div>
    </fieldset>
  </form>
</body>
</html>

【问题讨论】:

    标签: javascript android webview


    【解决方案1】:

    你没有将 Android 定义为 javascripinterface 你必须写在下面的行

     // If your callback methods are in same class then just same class object
     webView.addJavascriptInterface(this, "Android");
    

    addJavascriptInterface() 方法的语法

          addJavascriptInterface(Object object, String name);        
       //  1. `object` – *the Java object to inject into this WebView’s JavaScript context.*
       //  2. `name` – *the name used to expose the object in JavaScript*
    

    【讨论】:

    • 这听起来是个好主意。然而 JavascriptInterface 是一个 Java 接口;如果这种方法有效,我需要一个实际的课程。我正在寻找,但如果你已经知道,请告诉我。
    • 在哪个类中有getFullName 和getEmailAddr 方法? Java脚本接口和Java接口也不同。
    • 好的,根据您的原始答案,我想通了。您没有定义新的 JavascriptInterface。相反,我只需要以下代码: webView.addJavascriptInterface (this, "Android");如果您将更正您的答案 - 为了其他读者 - 我会将其标记为正确。谢谢。
    • 如果你在同一个类中创建你的回调方法那么你只需要传递'this'但是如果你有其他类那么你需要创建那个类的一个对象,(我的回答不是你?)
    • 你的推理是正确的。您帖子中的语法不是。您需要删除第一行。在“this”不能作为参数的情况下,它将是代码中存在的任何其他对象,其中包含 javascript-visible 方法。
    【解决方案2】:

    如果您在这里只是因为您只是在阅读文档,他们会遗漏一条仅在 addJavascriptInterface() 的参考文档中提供的关键信息。

    请注意,在页面下一次(重新)加载之前,注入的对象不会出现在 JavaScript 中。应该在注入对象之前启用 JavaScript。例如:

    class JsObject {
      @JavascriptInterface
      public String toString() { return "injectedObject"; }
    }
    webview.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JsObject(), "injectedObject");
    webView.loadData("", "text/html", null);
    webView.loadUrl("javascript:alert(injectedObject.toString())");
    

    https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2019-01-22
      • 2019-12-31
      相关资源
      最近更新 更多