在 UIWebView 和 WkWebview 中禁用 javascript 警报?

Posted

技术标签:

【中文标题】在 UIWebView 和 WkWebview 中禁用 javascript 警报?【英文标题】:Disable javascript alerts in UIWebView & WkWebview? 【发布时间】:2017-03-20 23:48:27 【问题描述】:

如本例中提到的 android 示例:Disable popups and alertboxes in android webview

WebChromeClient 可用于阻止 javascript 警报。

有人可以提供一个类似的示例来阻止 ios WebViews 和 WkWebViews 中的 window.alert|window.confirm|window.prompt javascript 警报吗?

【问题讨论】:

【参考方案1】:

在 wkwebview 中这是隐含的。 js 警报仅触发委托调用。警报必须由 objc/swift 代码触发

【讨论】:

嗨 Daij-Djan,你能解释一下你的答案吗?如果可能,请提供一些示例。 嗨 Daij-Djan,在这里了解一下。您是说即使 javascript 代码试图触发警报(),WkWebview 也会隐含地不显示警报?但这将由 WkWebview 托管对象以某种方式拦截并发出警报?【参考方案2】:

@roshabh 是的,我刚遇到同样的问题,你必须使用 WKWebview 的 UIDelegate 方法来显示警报/符合/提示效果。 代码如:

webview?.uiDelegate = self

扩展 MessageNoticeViewController: WKUIDelegate

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) 
    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)

    alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler:  (action) in
        completionHandler()
    ))

    present(alertController, animated: true, completion: nil)


func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) 
    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)

    alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler:  (action) in
        completionHandler(true)
    ))

    alertController.addAction(UIAlertAction(title: NSLocalizedString("cancel", comment: ""), style: .default, handler:  (action) in
        completionHandler(false)
    ))

    present(alertController, animated: true, completion: nil)


func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) 
    let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .alert)

    alertController.addTextField  (textField) in
        textField.text = defaultText
    

    alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler:  (action) in
        if let text = alertController.textFields?.first?.text 
            completionHandler(text)
         else 
            completionHandler(defaultText)
        
    ))

    alertController.addAction(UIAlertAction(title: NSLocalizedString("cancel", comment: ""), style: .default, handler:  (action) in
        completionHandler(nil)
    ))

    present(alertController, animated: true, completion: nil)

【讨论】:

以上是关于在 UIWebView 和 WkWebview 中禁用 javascript 警报?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 UIWebView 和/或 WKWebView 中样式表的加载

在 Xamarin WKWebView 和 UIWebView 之间共享 cookie

在 UIWebView/WKWebview 中禁用自动完成

与 UIWebView 相比,WKWebView 重定向问题

wkwebview和UIWebView调试技巧

UIWebView 和 WKWebView 导航