2017-04-19 57 views
0

我正在使用UIWebView加載作爲文章的網頁。一旦我按下按鈕,我就創建了一個結構體,其中url,titleimage。要訪問標題,我需要訪問網頁的源代碼,並從每個文章具有相同類ID(class =「c-page-title」)的h1 header中獲取標題。有誰知道如何使用stringByEvaluatingJavaScriptevaluateJavaScript函數從h1 header獲取文本?使用JavaScript和UIWebView通過ID檢索元素SWIFT

下面是我的一些代碼,以供參考:

結構:

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) 
} 

任何幫助將非常感謝!非常感謝提前。

乾杯, 西奧

回答

3

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

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

返回值將與「C-頁面標題」的類名的第一個元素的內部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 
} 

還銘記保持,這是使用完整的處理器中,異步,所以你需要建立你的邏輯了點。

+0

非常感謝!我會實現這一點,看看它是如何工作的。不幸的是,我從中獲取文本的網站不是我的,所以我無法編輯這些標籤。 –

+0

也可以,我只是做articleInst.title = webView.stringByEvaluatingJavaScript(「document.getElementsByClassName(\」c-page-title \「)[0] .innerHtml;」)或者我必須先定義函數? –

+0

'stringByEvaluatingJavaScript()'是UIWebView obj的一部分,所以你可以直接使用^ ....只是我沒有真正測試它的代碼,它是一種僞代碼,所以讓我知道如果你有任何其他問題:) –