【问题标题】:Use JavaScript with UIWebView to retrieve element by ID- SWIFT使用带有 UIWebView 的 JavaScript 通过 ID-SWIFT 检索元素
【发布时间】:2017-04-19 12:52:29
【问题描述】:

我正在使用UIWebView 加载作为文章的网页。一旦我按下一个按钮,我就会用urltitleimage 创建一个结构。要访问标题,我需要访问网页的源代码并从每篇文章具有相同类 ID (class="c-page-title") 的 h1 header 获取标题。有人知道如何使用stringByEvaluatingJavaScriptevaluateJavaScript 函数从h1 header 获取文本吗?

这是我的一些代码供参考:

结构:

struct Article {

    var url: URL
    var img: URL
    var title: String

    init(url: URL, img: URL, title: String) {
        self.url = url
        self.img = img
        self.title = title
    }
}

填充文章结构的函数:

    @IBAction func bookmarkArt(_ sender: Any) {

    let articleInst = Article(url: (mainWebView.request?.url)!, img: (mainWebView.request?.url)!, title: "Article Here")
    bookmarks.append(articleInst)
    print("array: \(bookmarks)")

    let alertController = UIAlertController(title: "Bookmark added!", message: "This article was just added to your bookmarks.", preferredStyle: UIAlertControllerStyle.alert)

    // Replace UIAlertActionStyle.Default by UIAlertActionStyle.default
    let okAction = UIAlertAction(title: "Awesome, thanks!", style: UIAlertActionStyle.default) {
        (result : UIAlertAction) -> Void in
        print("OK")
    }

    alertController.addAction(okAction)
    self.present(alertController, animated: true, completion: nil)
}

任何帮助将不胜感激!!提前非常感谢。

干杯, 西奥

【问题讨论】:

    标签: javascript ios swift xcode uiwebview


    【解决方案1】:

    当然可以使用func stringByEvaluatingJavaScript(from script: String) -> String?

    articleInst.title = webView.stringByEvaluatingJavaScript("document.getElementsByClassName(\"c-page-title\")[0].innerHtml;")
    

    返回值将是第一个类名为“c-page-title”的元素内的html。

    但是,我认为更好的方法是将您的 UIWebView 更改为 WKWebView。如果您从 iOS 代码在 webView 中运行大量脚本,这将提高您的 javascript 的性能。我还会将“c-page-title”从一个类更改为一个 ID,并确保页面上只存在一个。然后您可以使用func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil),这在 imo 中要好得多。

    所以它看起来像:

    webView.evaluateJavaScript("document.getElementById(\"c-page-title\").innerHtml;") {(response, error) in 
        if (response != nil) { 
            articleInst.title = response as! String
        }
        // error handling
    }
    

    另外请记住,这是使用完整的处理程序,它是异步的,因此您需要为此构建逻辑。

    【讨论】:

    • 非常感谢!!!我会实现它,看看它是如何工作的。不幸的是,我从中获取文本的网站不是我的,所以我无法编辑这些标签。
    • 另外,我可以只做 articleInst.title = webView.stringByEvaluatingJavaScript("document.getElementsByClassName(\"c-page-title\")[0].innerHtml;") 还是我必须做先定义函数?
    • stringByEvaluatingJavaScript() 是 UIWebView obj 的一部分,所以你可以使用它 ^.. 仅供参考,我实际上并没有测试该代码,它是一种伪代码,所以让我知道如果您还有其他问题:)
    • 成功了!必须按类获取元素,但无论如何我都会给你打勾。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2015-12-22
    • 2012-01-02
    • 2018-04-01
    相关资源
    最近更新 更多