javascript 嵌入 html 而不是 运行 wkwebview
javascript embedded in html not running in wkwebview
我正在使用 UIWebView 的应用程序中实现 wkwebview。当指向其中嵌入了 javascript 的本地 html 文件时,我无法让 javascript 执行。 javascript 被剥离以做一个简单的警报并加载基本的 google 地图。 None 正在执行。我需要 运行 本地服务器吗? GCDWeb 服务器..
我应该补充一点,html/javascript 在 safari 中工作,google 浏览器没问题。
尝试的解决方案包括:
1. AppTransportSecuritySettings 允许任意加载。
2. ViewController.swift webview.configuration.preferences.javaScriptEnabled = 真
3. This question解决了这个问题,并说是在 iOS 10.3 中修复的,模拟器是 运行ning 12.1
4.这个问题也解决了要求GCDWebserver能够使用wkwebview执行javascript的答案的问题。 然而,这在 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 的 None 有效,我应该收到警报,并且应该显示一个简单的 google 地图。我需要查看本地 Web 服务器 GCDWebserver 吗?
您应该在此 WKNavigationDelegate
方法中调用您的 javascript,该方法在 webview 完成加载时调用。
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("initMap()", completionHandler: { (value, err) in
// Handle response here.
})
}
此外,我不确定您为什么要调用两个不同的 webview.load()
请求 - 也许不要那样做?
我正在使用 UIWebView 的应用程序中实现 wkwebview。当指向其中嵌入了 javascript 的本地 html 文件时,我无法让 javascript 执行。 javascript 被剥离以做一个简单的警报并加载基本的 google 地图。 None 正在执行。我需要 运行 本地服务器吗? GCDWeb 服务器..
我应该补充一点,html/javascript 在 safari 中工作,google 浏览器没问题。
尝试的解决方案包括:
1. AppTransportSecuritySettings 允许任意加载。
2. ViewController.swift webview.configuration.preferences.javaScriptEnabled = 真
3. This question解决了这个问题,并说是在 iOS 10.3
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 的 None 有效,我应该收到警报,并且应该显示一个简单的 google 地图。我需要查看本地 Web 服务器 GCDWebserver 吗?
您应该在此 WKNavigationDelegate
方法中调用您的 javascript,该方法在 webview 完成加载时调用。
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("initMap()", completionHandler: { (value, err) in
// Handle response here.
})
}
此外,我不确定您为什么要调用两个不同的 webview.load()
请求 - 也许不要那样做?