【问题标题】:Swift Inject Javascript to remove HTML element into WebViewSwift Inject Javascript 将 HTML 元素删除到 WebView
【发布时间】:2020-10-23 02:51:42
【问题描述】:

我正在尝试将自己直接注入到源代码中。

我们想要执行此脚本,通过将 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的方法有什么问题吗?

【问题讨论】:

  • 我认为现在还为时过早,请尝试在webView(_ , didFinish

标签: swift webkit wkwebview


【解决方案1】:

首先,您的 javascript 代码将永远无法工作,因为您试图检索 id 为 mobile-promo 的元素,但您的元素的标签名称却是 mobile-promo。 (而且它没有 id 属性)

如果只有一个带有mobile-promo标签的HTML元素,那么下面的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 代码,iOS 8 提供了 WKUserScript API。您可以在 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 参数传递。正如文档所述:

在文档加载完成后注入脚本,但在此之前 其他子资源加载完毕。

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 2018-12-04
    • 2011-08-21
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2019-06-27
    相关资源
    最近更新 更多