1

我已经使用这个伟大教程的源代码成功地在网站 html 页面上获得了随机 HTML 的暗模式效果。

我上传了这些照片,以更好地解释我获得的东西。 随机加载的 html

已应用暗模式

我试图在 WKWebView 上获得相同的结果。HTML 是从 API 加载的,因此我使用 WKWebView.loadHTMLString 方法。对于此示例,演示 HTML 保存在 Xcode 项目的文件中。我还在 Xcode 中添加了 2 个 javascript 文件:darkmode.min.js(这是库)和 darkmode-options.js(页面底部切换的位置和文本标签)。我认为我没有正确注入使用 WKUserScript 的 2 个脚本。显然,darkmode.min.js 必须在 darkmode-options.js 之前加载。这就是我使用 WKUserScriptInjectionTime.atDocumentStart 和 WKUserScriptInjectionTime.atDocumentEnd 的原因。

此外,当我在控制台中打印 HTML 的视图源时,它不会显示已插入的脚本。

 private func initWebView() {

    let html = self.demoHTML
    let jsLibrary = self.darkModeLibraryJS
    let jsOptions = self.darkModeOptionsJS

    let webConfiguration = WKWebViewConfiguration()
    let contentController = WKUserContentController()

    // Libray script an document start
    let userScript = WKUserScript(source: jsLibrary, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
    contentController.addUserScript(userScript)

    // Options script and document end
    let optionsScript = WKUserScript(source: jsOptions, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
    contentController.addUserScript(optionsScript)

    webConfiguration.userContentController = contentController


    self.webview = WKWebView(frame: CGRect.zero, configuration: webConfiguration)
    self.webview?.navigationDelegate = self
    self.view.addSubview(webview!)

    self.webview!.loadHTMLString(html, baseURL: nil)
    self.webview!.fillSuperview() // after view has been added as subview
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    self.chechHTML()
}

private func chechHTML() {

    let script = "document.documentElement.outerHTML.toString()"

    self.webview?.evaluateJavaScript(script, completionHandler: { (html, error) in

        if html != nil {
            print("❌: check html response", html ?? "")
        }
        if error != nil {
            print("❌: check html with error", error ?? "")
        }
    })
}

项目上传到 github:https ://github.com/CristiGhn/darkmode-webview 。Xcode 项目还包含一个 darkmode.html,它可以正常工作并显示与上面的照片完全相同。

谢谢!

4

1 回答 1

1

使用本教程,我使用 mix-blend-mode: difference 实现了效果。

在文档开始和文档结束的 webiew 中注入多个 WKUserScript:

  1. 在文档开始时具有切换功能的 JavaScript 文件
  2. 注入带有背景和搅拌器的 div 容器,这将使混合有所不同(在文档结束时)
  3. 文档末尾 CSS 文件的内部样式标记内容

    let webConfiguration = WKWebViewConfiguration()
    let contentController = WKUserContentController()
    
    // Libray script an document start
    let darkModeScript = WKUserScript(source: self.darkModeLibraryJS, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
    contentController.addUserScript(darkModeScript)
    
    let injectDarkModeScript = WKUserScript(source: self.injectDarkModeJS, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
    contentController.addUserScript(injectDarkModeScript)
    
    let injectCSScript = WKUserScript(source: self.injectCSS, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
    contentController.addUserScript(injectCSScript)
    
    webConfiguration.userContentController = contentController
    
    self.webview = WKWebView(frame: CGRect.zero, configuration: webConfiguration)
    self.webview?.navigationDelegate = self
    self.view.addSubview(webview!)
    
    self.webview!.loadHTMLString(html, baseURL: nil)
    

具有切换功能的 JavaScript 和注入 CSS (darkmode.js)

function injectCSS(css) {
    head = document.head || document.getElementsByTagName('head')[0],
    style = document.createElement('style');
    head.appendChild(style);

    style.type = 'text/css';
    if (style.styleSheet){
         // This is required for IE8 and below.
        style.styleSheet.cssText = css;
    } else {
        style.appendChild(document.createTextNode(css));
    }
 }

 function showDarkMode() {
     var blender = document.getElementById('blender')
     if (blender.hasAttribute("hidden")) {
         blender.removeAttribute("hidden")
     }
  }

 function showOriginalMode() {
     var blender = document.getElementById('blender')

     if (!blender.hasAttribute("hidden")) {
         blender.setAttribute("hidden", true)
     }
 }

将 div 容器添加到 webview 的 DOM 的 JavaScript (inject-darkmode.js)

var container = document.createElement('div')
container.id = 'darkmode-container'
document.body.appendChild(container)

var background = document.createElement('div')
background.classList.add('darkmode-background')
container.appendChild(background)

var blender = document.createElement('div')
blender.id = 'blender'
blender.setAttribute('hidden', true)
container.appendChild(blender)

用于定义搅拌机和背景的 CSS (darkmode.css)

#blender {
    width: 100vw;
    height: 100vh;
    left: 0pt;
    top: 0pt;
    position: fixed;
    background: white;
    transition: all 1s ease;
    mix-blend-mode: difference;
 }

 img {
     isolation: isolate;
 }

 .darkmode-background {
     position: fixed;
     background: white;
     top: 0;
     left: 0;
     width: 100vw;
     height: 100vh;
     z-index: -1;
 }

带有工作项目的存储库:https ://github.com/CristiGhn/darkmode-webview

于 2019-07-19T19:40:04.330 回答