Swift 注入 Javascript 以将 HTML 元素移除到 WebView
Swift Inject Javascript to remove HTML element into WebView
我正在尝试将自己直接注入到源代码中。
我们想通过将 javascript 注入 webview 来执行此脚本以删除 google.com 上的横幅,但它不起作用。
这是我们要删除的代码块:
<mobile-promo jsname="EfADOe" jscontroller="sqHuef" jsaction="rcuQ6b:npT2md"> </mobile-promo>
这是行不通的:
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
let removeGoogleBottomBar = """
function removeDummy() {
var elem = document.getElementById('mobile-promo');
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
"""
webView.evaluateJavaScript(removeGoogleBottomBar)
}
这种注入方式有什么问题吗javascript?
首先,您的 javascript 代码将永远无法工作,因为您正在尝试检索 ID 为 mobile-promo
的元素,但您的元素的标签名称是 mobile-promo
。 (并且它没有 id 属性)
如果只有一个 HTML 元素以 mobile-promo
作为标签,则以下 javascript 代码将起作用:
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo')[0];
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
如果没有,那么你应该这样做:
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo');
for (var i = 0; i < elem.length; i++) {
if (elem[i].getAttribute("jsname") == "EfADOe" && elem[i].getAttribute("jscontroller") == "sqHuef" && elem[i].getAttribute("jsaction") == "rcuQ6b:npT2md") {
elem[i].parentNode.removeChild(elem[i]);
}
}
return false;
}
removeDummy()
要注入您的 javascript 代码,WKUserScript API 可从 iOS 8 获得。您可以在 viewDidLoad
执行类似的操作:
override func viewDidLoad() {
super.viewDidLoad()
let source = """
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo')[0];
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
"""
let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(script)
}
请注意,为了安全起见,我们将 .atDocumentEnd 作为 injectionTime
参数传递。如文档所述:
Inject the script after the document finishes loading, but before
other subresources finish loading.
我正在尝试将自己直接注入到源代码中。
我们想通过将 javascript 注入 webview 来执行此脚本以删除 google.com 上的横幅,但它不起作用。
这是我们要删除的代码块:
<mobile-promo jsname="EfADOe" jscontroller="sqHuef" jsaction="rcuQ6b:npT2md"> </mobile-promo>
这是行不通的:
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
let removeGoogleBottomBar = """
function removeDummy() {
var elem = document.getElementById('mobile-promo');
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
"""
webView.evaluateJavaScript(removeGoogleBottomBar)
}
这种注入方式有什么问题吗javascript?
首先,您的 javascript 代码将永远无法工作,因为您正在尝试检索 ID 为 mobile-promo
的元素,但您的元素的标签名称是 mobile-promo
。 (并且它没有 id 属性)
如果只有一个 HTML 元素以 mobile-promo
作为标签,则以下 javascript 代码将起作用:
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo')[0];
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
如果没有,那么你应该这样做:
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo');
for (var i = 0; i < elem.length; i++) {
if (elem[i].getAttribute("jsname") == "EfADOe" && elem[i].getAttribute("jscontroller") == "sqHuef" && elem[i].getAttribute("jsaction") == "rcuQ6b:npT2md") {
elem[i].parentNode.removeChild(elem[i]);
}
}
return false;
}
removeDummy()
要注入您的 javascript 代码,WKUserScript API 可从 iOS 8 获得。您可以在 viewDidLoad
执行类似的操作:
override func viewDidLoad() {
super.viewDidLoad()
let source = """
function removeDummy() {
var elem = document.getElementsByTagName('mobile-promo')[0];
elem.parentNode.removeChild(elem);
return false;
}
removeDummy()
"""
let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(script)
}
请注意,为了安全起见,我们将 .atDocumentEnd 作为 injectionTime
参数传递。如文档所述:
Inject the script after the document finishes loading, but before other subresources finish loading.