2015-01-08 13 views
12

Tôi cố gắng để gọi một chức năng tồn tại từ một trang web từ xa trong một WKWebview:WKWebview evaluateJavascript không hoạt động, ném một lỗi

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

Với:

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

Nhưng điều này là ném một lỗi :

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

Điều này thật đơn giản! Tôi phải thiếu một cái gì đó thực sự ngu ngốc!

+0

jQuery có được tải trên trang đó không? – AstroCB

+0

Vâng, đó là một trang web đầy đủ chức năng, tôi chỉ đang xây dựng một cây cầu để thực hiện công việc đăng nhập facebook. Và chức năng cũng hoạt động khi tôi thường gọi trên trình duyệt. –

+0

Hãy thử mà không cần jQuery: 'document.getElementById ('webviewtest'). InnerHTML = text;'. Có thể phương thức 'html' không thành công. – Pinal

Trả lời

27

Tìm thấy giải pháp, nó đơn giản như tôi mong đợi, tôi đã thêm javascript trước khi khung nhìn tải xong nội dung (trước khi đã sẵn sàng cho Dom). Vì vậy, tôi chỉ phải di chuyển mã của tôi để các phương pháp đại biểu dưới đây:

Tôi hy vọng điều này sẽ giúp một ai đó.

+0

Đây là một giải pháp! Obviusly nhưng tiết kiệm cho tôi rất nhiều thời gian cảm ơn bạn. –

+0

Không làm việc cho tôi. – Jitendra

+0

Bạn đã thực hiện đại biểu chưa? –

3

Tôi phát hiện thấy sự cố là do số webView:didFinishNavigation: được gọi trước khi nội dung trang thực sự được tải. Tôi nghĩ rằng trang web đang sử dụng angularjs.

tôi giới thiệu một sự chậm trễ của nhãn hiệu mà dường như d các trick cho tôi:

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


    } 

và đã gọi tôi ở đây:

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

Lý tưởng nhất là giải pháp tốt nhất sẽ có một người biết lắng nghe đẩy một sự kiện cho angularjs "trang đã sẵn sàng" nhưng tôi không chắc chắn điều này là có thể trong wkwebview.

Các vấn đề liên quan