2017-04-19 4 views
0

UIWebViewを使用して記事であるWebページを読み込んでいます。一度ボタンを押すと、urltitle、およびimageの構造体が作成されます。タイトルにアクセスするには、ウェブページのソースコードにアクセスして、記事ごとに同じクラスID(class = "c-page-title")を持つh1 headerのタイトルを取得する必要があります。誰でもh1 headerからテキストを取得するには、stringByEvaluatingJavaScriptまたはevaluateJavaScript関数を使用する方法を知っていますか?IDW-SWIFTで要素を取得するためにUIWebViewでJavaScriptを使用

のStruct::記事の構造体を埋め

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

あなたは、「C-ページタイトル」のクラス名を持つ最初の要素の内部HTMLになりますfunc stringByEvaluatingJavaScript(from script: String) -> String?

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

戻り値を使用することができます。

しかし、より良いアプローチは、あなたのUIWebViewをWKWebViewに変更することだと思います。 iOSコードからWebViewの中にたくさんのスクリプトを実行している場合、これはあなたのJavaScriptのパフォーマンスを向上させます。私はクラスからその「c-page-title」をIDに変更し、ページ上に1つしか存在しないようにします。あなたはfunc evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil)を使うことができます。これははるかに優れています。

だから、それは次のようになります。

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の一部ですので、ちょうどfyiを使用することができます。実際にそのコードを擬似コードのようにテストしていないので、他の質問があれば教えてください:) –

関連する問題