WKWebview evaluateJavascript is not working, throws an error

I am trying to call an existent function from a remote site in a WKWebview:

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

With:

  • iOS: evaluateJavaScript will not invoke function when parameter contains newline character
  • Use shared WKWebViewCookies for a request
  • How to autoscale the contents of a WKWebView?
  • Why INSPECT ELEMENT or WEB INSPECTOR or developerExtrasEnabled (WkWebView) is not working in iOS While its working for OSX
  • How to delete WKWebview cookies
  • JS calling a function in Swift
  • [self.WebView evaluateJavaScript:@"addtext(\"This is a text from app\");" completionHandler:^(id Result, NSError * error) {
        NSLog(@"Error -> %@", error);
    }];
    

    But this is throwing an error:

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

    This is so simple! I am must missing something really stupid!

    2 Solutions Collect From Internet About “WKWebview evaluateJavascript is not working, throws an error”

    Found a solution, it was simple as I was expecting, I was adding the javascript before the view complete load the content (before the Dom Ready). So I just had to move my code to the delegate method below:

    • webView:didFinishNavigation: (from WKNavigationDelegate)

    I hope this helps someone.

    I found that the problem was caused by the webView:didFinishNavigation: being called before the page content was actually loaded. I think the website is using angularjs.

    I introduced a manual delay which seemed to d the trick for me :

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

    and did my call here:

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

    Ideally the best solution would have a listener push an event for angularjs “page ready” but I am not sure this is possible in wkwebview.