> `window.JSInterface` 是一个用于在 Web 页面中与本地代码进行交互的 JavaScript 对象。通常情况下,这个对象会在 WebView 中被使用,例如在 Android 应用程序中的 WebView 中。 以下是一个使用 `window.JSInterface` 的示例: #### 1. HTML 页面中添加一个按钮: ```html <button onclick="callNative()">调用本地代码</button> ``` #### 2. JavaScript 代码中定义 callNative 函数,并使用 window.JSInterface 调用本地代码: ```javascript function callNative() { if (window.JSInterface) { window.JSInterface.callNativeMethod(); } else { console.log("JSInterface not available"); } } ``` #### 3. 在本地代码中实现 callNativeMethod 方法: ```java public class MyWebView extends WebView { public MyWebView(Context context) { super(context); // ... this.addJavascriptInterface(new JSInterface(), "JSInterface"); } private class JSInterface { @JavascriptInterface public void callNativeMethod() { // 调用本地方法 // ... } } } ``` >在上面的例子中,当用户点击 HTML 页面中的按钮时,将调用 callNative 函数。如果 `window.JSInterface` 对象可用,那么将调用` window.JSInterface.callNativeMethod()` 方法。在本地代码中,MyWebView 类继承自 WebView,并实现了一个名为 JSInterface 的内部类,该类包含一个名为 `callNativeMethod` 的方法。当 `window.JSInterface.callNativeMethod()` 方法被调用时,将会在 JSInterface 类中执行 `callNativeMethod` 方法的代码。 需要注意的是,使用 window.JSInterface 需要谨慎,因为它可能会导致安全漏洞。在使用时应该注意不要直接将用户输入的内容传递给本地代码,以避免潜在的安全问题。 ###报错提醒 ``` `JSInterface not available` ``` >当在 Web 页面中使用 window.JSInterface 对象时,如果它不可用,那么通常意味着该对象并没有被正确地初始化或者并没有被正确地注入到 WebView 中。 以下是一些可能导致 `window.JSInterface` 不可用的原因: ####1. 对象未被正确注入到 WebView 中。 在 `Android` 应用程序中,可以通过调用 `WebView` 的` addJavascriptInterface` 方法来将 JavaScript 对象注入到 `WebView` 中。如果该方法未被正确地使用,那么 `JavaScript` 对象将不会被注入到 WebView 中,导致 `window.JSInterface` 不可用。 ####2. 对象未被正确命名。 在注入 `JavaScript` 对象到 `WebView `中时,需要为该对象命名。该名称将成为 `JavaScript` 对象的全局变量名。如果在注入时没有为该对象命名,或者名称与 `JavaScript` 对象的全局变量名不匹配,那么 `window.JSInterface` 对象将无法被正确地访问。 ####3. 对象未被正确初始化。 在 `Android` 应用程序中,`JSInterface` 对象必须实现至少一个方法,并且这些方法必须使用 `@JavascriptInterface` 注解进行标记。如果 `JSInterface` 对象未被正确地初始化,那么 `window.JSInterface` 对象将无法被正确地访问。 >如果出现 `JSInterface not available` 的错误,可以检查上述原因并进行排查。可以通过在 `JavaScript` 代码中添加 `console.log` 语句来输出调试信息,以便更好地理解问题的原因。在调试期间,也可以使用浏览器的开发者工具来检查 `window.JSInterface` 对象是否已被正确地注入到 `WebView` 中。