iOS WKWebView 不显示 JavaScript alert() 弹窗解决方案

在开发 iOS 原生应用时,我们常常需要使用 WKWebView 来加载 Web 页面。但是,在使用 WKWebView 时,有可能会遇到一个问题:JavaScript 中的 alert() 函数无法弹出提示框。

问题描述

当我们在 JavaScript 中调用 alert('Hello, world!') 函数时,理论上应该会弹出一个带有 "Hello, world!" 文字的提示框。但是,在 WKWebView 中,这个提示框并不会显示出来。

问题原因

WKWebView 的 JavaScript 环境和原生应用的 JavaScript 环境是相互独立的。当我们在 JS 中调用 alert() 函数时,实际上是要让原生应用弹出对话框。但是,由于 WKWebView 和原生应用是两个不同的进程,所以无法直接通信。因此,WKWebView 中的 alert() 函数调用就无法触发原生应用中的对话框。

解决方案

为了解决这个问题,我们需要为 WKWebView 注入一些 JavaScript 代码,使得它可以将 alert() 函数的调用请求发送给原生应用,并在原生应用中显示对话框。

以下是针对 WKWebView 中 alert() 函数无法弹出提示框的解决方案:

步骤一:实现 WKScriptMessageHandler 协议

首先,我们需要在原生应用中实现 WKScriptMessageHandler 协议。这个协议定义了一些方法,可以让我们接收来自 WKWebView 的 JavaScript 消息。

----- --------------- ----------------- ---------------------- -
    -------- ---- ------------- -
        -------------------
        
        -- -- ---------
        --- ------- - ---------------- ------------
        ------------------------
        
        -- -------
        --- ----------------- - -------------------------------------------
        --------------------------- ----- --------  -- ------ ------- ---
    -
    
    -- -- ---------------------- ------
    ---- ----------------------- ---------------------- ------------------------ ---------- -------- ---------------- -
        -- ------------ -- -------- --- ---- - ------------ --- -------- ---- -
            --- ----- - ------------- --- ------ -- --
            --- ------- - --------------- --- ------ -- --
            
            -- -------
            --- --------------- - ------------------------ ------ -------- -------- --------------- -------
            --- -------- - -------------------- ----- ------ --------- -------- ----
            -----------------------------------
            ------------------------ --------- ----- ----------- ----
        -
    -
-

上述代码中,我们在 viewDidLoad() 方法中创建了一个 WKWebView,并注册了一个名为 "alert" 的消息处理器。当 WKWebView 中调用 window.webkit.messageHandlers.alert.postMessage({title: 'Hello', message: 'World!'}) 时,就会触发 didReceive() 方法。在 didReceive() 方法中,我们可以将 titlemessage 作为参数,创建一个原生的 UIAlertController,并显示出来。

步骤二:为 WKWebView 注入 JavaScript 代码

接下来,我们需要为 WKWebView 注入一些 JavaScript 代码,让它可以将 alert() 函数的调用请求发送给原生应用。具体来说,我们可以使用 window.webkit.messageHandlers.alert.postMessage() 将消息发送到原生应用中。

以下是注入 JavaScript 代码的示例:

--- ------ - ---
    ------------ - ----------------- -
        -------------------------------------------------
            ------ ---
            -------- -------
        ---
    --
---
--- ------ - -------------------- ------- -------------- ----------------- ----------------- ------
-----------------------------------------------------------------

上述代码中,我们定义了一个名为 alert() 的 JavaScript 函数,并将它重写为向原生应用发送消息

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/27612


猜你喜欢

  • 如何在 .each() 循环中跳出并为函数返回值

    在前端开发中,我们经常会遇到需要对数组或对象进行循环处理的情况。jQuery 提供了一个强大的 .each() 方法,可以快速便捷地实现循环操作。然而,有时候我们需要在循环中跳出,并将最终结果作为函数...

    7 年前
  • 如何对 JavaScript 对象进行排序或将其转换为数组?

    JavaScript 是一种灵活的编程语言,它允许开发人员使用多种数据结构来处理数据。其中之一是对象,这是一种包含属性和值的集合。在某些情况下,需要对对象进行排序或将其转换为数组以便于操作。

    7 年前
  • 在 Firebug/Chrome 控制台中与 require.js 模块进行交互

    在前端开发中,我们常常使用模块化加载器来管理 JavaScript 代码。require.js 是其中一种流行的模块化加载器,在使用 require.js 进行开发时,我们可能会需要在控制台中与 re...

    7 年前
  • React JS - Uncaught TypeError: this.props.data.map is not a function

    在 React 中开发时,有时您可能会遇到TypeError: this.props.data.map is not a function 的错误。这种情况通常发生在尝试对一个不可迭代对象调用map函...

    7 年前
  • AngularJS:如何从ui-grid单元格模板中访问作用域?

    当使用AngularJS结合ui-grid时,我们经常需要在单元格中显示一些自定义内容。为了实现这一点,我们可以使用ui-grid提供的cellTemplate选项来定制单元格的外观和行为。

    7 年前
  • 为什么 JavaScript 函数名会和元素 ID 冲突?

    为什么 JavaScript 函数名会和元素 ID 冲突? 在前端开发中,经常会有函数名与元素 ID 冲突的情况。这种冲突可能导致一些预期之外的行为,也让代码变得难以维护。

    7 年前
  • 在 JavaScript 中比较对象数组

    JavaScript 中常常需要比较两个对象数组,以检查它们是否相等或包含某些元素。在这篇文章中,我们将探讨如何比较对象数组,并提供一些示例代码和指导意义。 1. 比较两个对象数组是否相等 判断两个对...

    7 年前
  • Jquery/Ajax call with timer

    在前端开发中,使用Ajax和Jquery进行异步通信是非常常见的一种方式。然而,有时候我们需要定时发送请求或者定时更新页面内容,这时候就需要使用定时器来实现。本文将介绍如何使用Jquery和Ajax结...

    7 年前
  • 比较字符串相似度的 Javascript 方法及其应用

    在前端开发中,字符串比较是一个常见的需求。如果我们需要比较两个字符串之间的相似程度,例如判断用户输入的文本是否匹配某个关键词,或者对比两个长篇文章的相似度等等,该怎么办呢?在本文中,我将介绍使用 Ja...

    7 年前
  • 在 Chrome 中设置 DOM 断点

    DOM 断点是前端开发中非常有用的调试工具。它可以帮助我们快速找到网页中的特定元素并在其上暂停代码执行,以便进行调试。在 Chrome 浏览器中,我们可以使用开发者工具来设置 DOM 断点。

    7 年前
  • Extending the defaults of a Model superclass in Backbone.js

    Communitymcdoh提出了一个问题:Extending the defaults of a Model superclass in Backbone.js,或许与您遇到的问题类似。

    7 年前
  • 在 JavaScript 函数中使用 "return this" 是什么意思?

    在 JavaScript 中,"return this" 是一个常用的技巧,它可以让函数返回当前对象的引用,从而实现链式调用。 什么是链式调用? 链式调用是一种编程模式,它允许我们通过一系列连续的方法...

    7 年前
  • 在JavaScript中执行后台任务

    在前端开发中,我们常常需要执行一些后台任务,例如发送AJAX请求、计算大量数据或者定期更新UI。在过去,这些任务通常会阻塞UI线程,导致应用程序变得缓慢或者卡顿,影响用户的体验。

    7 年前
  • 如何找到 touchmove 事件的实际 event.target?

    在移动端开发中,touchmove 事件是非常重要的一个事件,通常用于监听用户手指在屏幕上的滑动操作。但是,当需要对具体某个元素做出响应时,却很难确定 touchmove 事件的实际目标元素(even...

    7 年前
  • 如何使用 HTML5 文件 API 在 Canvas 上绘制图像

    在前端开发中,我们通常需要在网页上展示图片。而使用 HTML5 的 File API 和 Canvas API 可以让我们更加灵活地控制图片的展示形式,比如可以进行缩放、裁剪、旋转等操作。

    7 年前
  • 对象属性排序和JSON.stringify

    在前端开发中,我们经常需要对对象进行操作和序列化。其中,对于对象的属性排序和使用JSON.stringify序列化对象是两个常见但有时容易被忽略的问题。本文将介绍如何对对象属性进行排序,并给出使用JS...

    7 年前
  • Jasmine Tests in Karma: 解决 "Uncaught ReferenceError: require is not defined" 的问题

    在前端开发中,测试是非常重要的一环。Jasmine 是一个流行的 JavaScript 测试框架,而 Karma 则是一个用于运行测试的工具。然而,当你在使用 Karma 运行 Jasmine 测试时...

    7 年前
  • Async/await 与 ES6 生成器中的 yield 的区别

    在 JavaScript 中,当需要处理异步操作时,我们通常会使用回调函数或者 Promise。然而,回调函数的嵌套和 Promise 的链式调用都会导致代码难以维护和理解。

    7 年前
  • 动态更改 Bootstrap 进度条值

    Bootstrap 是一个流行的前端框架,可以轻松地创建漂亮的 UI。其中一个组件是进度条,可以用于显示操作的进度。在本文中,我们将学习如何使用 JavaScript 和 jQuery 动态更改 Bo...

    7 年前
  • 为什么在 IE 中使用 setAttribute 设置 onclick 属性无法生效?

    JavaScript 是编写前端代码最常用的语言之一,而 onclick 属性则是其中一个基本的 DOM 事件。然而,在 Internet Explorer(IE)浏览器中,使用 setAttribu...

    7 年前

相关推荐

    暂无文章