Получение заголовка из WKWebView с помощью оценкиJavaScript

У меня очень простой/легкий вопрос, но у меня нет абсолютно никакого опыта работы с java. У меня есть WKWebView, и я хочу получить текст заголовка страницы, используя javascript document.getElementById.

Веб-страница, с которой я пытаюсь получить заголовок, имеет этот код:

<html>
<body>
<div class="toolbar">
<h1 id="pageTitle">Schedules</h1>
</div>
</body>
<html>

Этот код сокращен, поэтому я прошу прощения за любые ошибки.

Затем я пытаюсь получить доступ к pageTitle в Swift с помощью:

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {

    webView.evaluateJavaScript("document.getElementById('pageTitle').value") { (result, error) -> Void in
        if error != nil {
            print(result)
        }
    }
}

И результат возвращает ноль. После нескольких часов поиска я до сих пор понятия не имею, как заставить это работать. Любая помощь приветствуется.


person Tamarisk    schedule 24.09.2015    source источник


Ответы (6)


Вам не нужно использовать javascript для получения заголовка страницы. WKWebView имеет свойство title который доставит это для вас

https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/#//apple_ref/occ/instp/WKWebView/title

title Заголовок страницы. (только для чтения)

СВИФТ var title: String? { get }

Класс WKWebView поддерживает наблюдение за ключом и значением (KVO) для этого свойства.

Доступно в iOS 8.0 и более поздних версиях.

person SilkyPantsDan    schedule 24.09.2015
comment
Ага, понятно. Это полезно знать, но на веб-странице есть и другие элементы, которые я также хотел бы получить. Я хотел получить общее представление о процессе, чтобы я мог получить другие подробности в будущем. - person Tamarisk; 24.09.2015
comment
у вас есть дополнительный вопрос, потому что этот ответ не отвечает на мой вопрос, который совпадает с вашим, но не по заголовку. - person ingrid; 09.09.2016

Как упоминал @SilkyPantsDan, если вас просто интересует title, нет необходимости использовать JS. Сначала вы начинаете наблюдать:

override func viewDidLoad() {
    super.viewDidLoad()
    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.title), options: .new, context: nil)
}

И обработайте свою логику при обновлении title:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "title" {
        title = webView.title
    }
}

Наконец, вам следует прекратить наблюдение, если вы поддерживаете iOS 8.0, так как наблюдатели не удаляются автоматически до iOS 9.0:

deinit {
    webView.removeObserver(self, forKeyPath: "title")
    //webView.removeObserver(self, forKeyPath: "estimatedProgress")
}
person superarts.org    schedule 17.02.2019
comment
Во втором блоке кода выше опечатка. Вторая строка должна быть if keyPath == "title" { - person Drew; 28.12.2019

В вашем коде, когда есть какая-то ошибка, код выведет результат. Это ничего не напечатает, если нет ошибок.

Так что измените код на этот, все работает хорошо.

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {

    webView.evaluateJavaScript("document.getElementById('pageTitle').innerHTML") { (result, error) -> Void in
        if error != nil {
            print(error)
        }
        print(result)
    }
}
person LF00    schedule 25.04.2017

Используйте Node.textContent, чтобы получить правильную копию содержимого текстовых узлов.

webView.evaluateJavaScript("document.getElementById('pageTitle').textContent") { (result, error) -> Void in
    if error != nil {
        print(result)
    }
}
person dopcn    schedule 24.09.2015

Я использовал тот же фрагмент кода и решил проблему... Результат будет напечатан только в том случае, если он "ноль"!

Пытаться:

webView.evaluateJavaScript("document.getElementById('pageTitle').textContent") { (result, error) -> Void in
    if error == nil {
        print(result)
    }
}
person brassic_lint    schedule 29.01.2016
comment
Как это поможет ОП в устранении текущей проблемы? - person ρяσѕρєя K; 29.01.2016
comment
Потому что есть большая вероятность, что код работает, но OP никогда не увидит результат! Единственный вывод будет нулевым - person brassic_lint; 31.01.2016

этот код работает для меня:

webView.evaluateJavaScript("document.title').textContent") { (result, error) -> Void in
    if error == nil {
        print(result)
    }
}
person Return Zero    schedule 29.05.2017