WKWebview EvaluateJavascript не работает, выдает ошибку

Я пытаюсь вызвать существующую функцию с удаленного сайта в WKWebview:

function addtext (text) {
 jQuery("#webviewtest").html(text);
}

С:

[self.WebView evaluateJavaScript:@"addtext(\"This is a text from app\");" completionHandler:^(id Result, NSError * error) {
    NSLog(@"Error -> %@", error);
}];

Но это выдает ошибку:

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo=0x170c788c0 {NSLocalizedDescription=A JavaScript exception occurred}

Это так просто! Я должен упустить что-то действительно глупое!


person Rogers Sampaio    schedule 08.01.2015    source источник
comment
Загружен ли jQuery на этой странице?   -  person AstroCB    schedule 09.01.2015
comment
Да, это полностью функциональный веб-сайт, я просто строю мост, чтобы вход в Facebook работал. И Функция также работает, когда я обычно вызываю браузер.   -  person Rogers Sampaio    schedule 09.01.2015
comment
Попробуйте без jQuery: document.getElementById('webviewtest').innerHTML = text;. Возможно, метод html не работает.   -  person Pinal    schedule 09.01.2015
comment
Эй, @Pinal, ты заставил меня понять, что это проблема DOM Ready. Посмотрите на мой ответ ниже. Ваше здоровье.   -  person Rogers Sampaio    schedule 09.01.2015


Ответы (2)


Нашел решение, оно было простым, как я и ожидал, я добавлял javascript до того, как представление полностью загрузило контент (до того, как Dom Ready). Поэтому мне просто нужно было переместить свой код в метод делегата ниже:

Я надеюсь, что это помогает кому-то.

person Rogers Sampaio    schedule 09.01.2015
comment
Это решение! Очевидно, но сэкономил мне много времени, спасибо. - person Alessandro Ornano; 14.06.2016
comment
Вы реализовали делегата? - person Rogers Sampaio; 15.12.2016

Я обнаружил, что проблема была вызвана вызовом webView:didFinishNavigation: до фактической загрузки содержимого страницы. Я думаю, что веб-сайт использует angularjs.

Я ввел ручную задержку, которая, казалось, помогла мне:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print("loaded)")
    //abtn_run(UIButton())
    self.perform(#selector(performAction), with: nil, afterDelay: 3.0)    
}

и сделал мой звонок здесь:

func performAction() {
    //This function will perform this after delay of 3 seconds
}

В идеале лучшим решением было бы, чтобы слушатель отправлял событие для angularjs «страница готова», но я не уверен, что это возможно в wkwebview.

person UKDataGeek    schedule 30.12.2016