嵌入在 html 中的 javascript 未在 wkwebview 中运行

Posted

技术标签:

【中文标题】嵌入在 html 中的 javascript 未在 wkwebview 中运行【英文标题】:javascript embedded in html not running in wkwebview 【发布时间】:2019-06-13 15:07:27 【问题描述】:

我正在使用 UIWebView 的应用程序中实现 wkwebview。当指向嵌入了 javascript 的本地 html 文件时,我无法执行 javascript。 javascript 被剥离来做一个简单的警报并加载一个基本的谷歌地图。这些都没有被执行。我需要运行本地服务器吗? GCDWebserver..

我应该补充一下,html/javascript 在 safari 中工作,谷歌浏览器没问题。

尝试的解决方案包括: 1. AppTransportSecuritySettings AllowArbitrary 加载。 2. ViewController.swift webview.configuration.preferences.javaScriptEnabled = true 3.这个问题解决了这个问题,并说是在ios 10.3中修复Load Javascript files through HTML file on WKWebView in iOS模拟器正在运行12.1 4. 这个问题还解决了要求 GCDWebserver 能够使用 wkwebview 执行 javascript 的答案的问题。 WKWebView not executing any js code 然而,这在 iOS 的最新版本中也得到了解决。这是一些代码:

import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate 
    //@IBOutlet var googleMap: WKWebView!
    var webview: WKWebView!

     override func loadView() 
         webview = WKWebView()
         webview.navigationDelegate = self
         view = webview
     
    override func viewDidLoad() 
        super.viewDidLoad()
        //let url = URL(string: "https://schallerf1.com")!
        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "www")!
        webview.load(URLRequest(url: url))
        webview.allowsBackForwardNavigationGestures = true
        let request = URLRequest(url: url)
        webview.configuration.preferences.javaScriptEnabled = true
        webview.load(request)
    

<!DOCTYPE html>
<html>
    <head>
        <title>Simple Map</title>
        <meta name="viewport" content="initial-scale=1.0">
            <meta charset="utf-8">
                <style>
                    /* Always set the map height explicitly to define the size of the div
                     * element that contains the map. */
                #map 
                    height: 100%;
                
                /* Optional: Makes the sample page fill the window. */
                html, body 
                    height: 100%;
                    margin: 0;
                    padding: 0;
                
                </style>
                </head>
    <body>
        <b>WHYYYYYYYYYY!!!!</b>
        <div style="height:100%;width:100%;" id="map"></div>
        <script type="text/javascript">
            var name = "TESTTESTTEST";
            alert('code: '    + name + '\n');
            var map;
            function initMap() 
                map = new google.maps.Map(document.getElementById('map'), 
                                          center: lat: 39.976068, lng: -83.003297,
                                          zoom: 8
                                          );
            
        </script>
        <script async defer src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxxxxxxxx&callback=initMap"></script>
    </body>
</html>

所有的 javascript 都不起作用,我应该得到一个警报,并且应该显示一个简单的谷歌地图。我需要查看本地 Web 服务器 GCDWebserver 吗?

【问题讨论】:

【参考方案1】:

您应该在这个WKNavigationDelegate 方法中调用您的javascript,该方法在webview 完成加载时调用。

public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
    webView.evaluateJavaScript("initMap()", completionHandler:  (value, err) in
        // Handle response here.
    )

另外,我不确定您为什么要调用两个不同的 webview.load() 请求 - 也许不要那样做?

【讨论】:

感谢 Jake 抽出宝贵时间回答。我按照建议实施了 WkNavigationDelegate。似乎仍然没有执行 javascript。我的 index.html 文件在 main.html 上做了一个 window.load。因此在 main.html 中找不到 initMap() 函数。我在 index.html 中添加了一个带有警报 alert('code:' + name + ' \n') 和 console.log console.log("i should see this in the console"); 的测试函数,但是即使找到了该函数,它们也没有被执行。有什么想法吗? 尝试在上述函数的completionHandler (evaluateJavaScript) 中打印出valueerr。它说什么? 嗨,杰克。 value 什么都不返回,err 返回 nil。这是控制台的输出;可选(错误域=WKErrorDomain 代码=4“发生 JavaScript 异常”UserInfo=WKJavaScriptExceptionLineNumber=1,WKJavaScriptExceptionMessage=ReferenceError:找不到变量:initMap,WKJavaScriptExceptionColumnNumber=8,WKJavaScriptExceptionSourceURL=file:///Users/shallerf1/Library /Developer/CoreSimulator/Devices/data/Containers/Bundle/Application/30497599-5839-4A2C-87F7-CC2D8F4F16DA/HistOrigin.app/www/index.html, NSLocalizedDescription=发生 JavaScript 异常) nil 这里的关键信息是“找不到变量:initMap”——它在任何地方都找不到你的 JS function。确保您正在加载正确的源。尝试从您的资源 URL 中删除 subdirectory: "www"。而是:Bundle.main.url(forResource: "index", withExtension: "html")! Jake,您关于消除 index.htm 文件以直接指向 main.html 文件的建议就是这个问题的答案。我现在正面临下一个障碍,但这是一个新问题。非常感谢您的时间和精力。

以上是关于嵌入在 html 中的 javascript 未在 wkwebview 中运行的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 在html中的嵌入方式

Javascript 在html中的嵌入方式

javascript - 使用另一个函数中的变量 javascript - '今天未在对象中定义'

嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?

html/javascript onsubmit 事件未在表单提交上调用以验证表单

来自html字符串的iOS Swift 4图像未在WKWebView中加载