嵌入在 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
) 中打印出value
和err
。它说什么?
嗨,杰克。 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 - 使用另一个函数中的变量 javascript - '今天未在对象中定义'
嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?