2011-01-14 27 views
13

Tôi có một số UIWebView tải lên một trang HTML. Trang này có hai nút trên đó, nói Exit và Submit. Tôi không muốn người dùng có thể nhấp vào nút Thoát, vì vậy khi trang tải xong (ví dụ: webViewDidFinishLoad được gọi), tôi sử dụng stringByEvaluatingJavaScriptFromString để xóa một trong các nút này bằng cách thao tác HTML. Tôi cũng vô hiệu hóa tương tác của người dùng trên UIWebView trên webViewDidStartLoad và bật lại tính năng này trên webViewDidFinishLoad.Xác định khi stringByEvaluatingJavaScriptFromString đã hoàn tất

Vấn đề tôi đang tìm kiếm là stringByEvaluatingJavaScriptFromString mất một hoặc hai giây để hoàn thành và dường như được thực hiện trong chuỗi riêng của nó. Vì vậy, những gì đang xảy ra là webViewDidFinishLoad được gọi, tương tác người dùng được bật trên UIWebView và nếu người dùng nhanh chóng, họ có thể nhấp vào nút Thoát trước khi stringByEvaluatingJavaScriptFromString kết thúc. Khi stringByEvaluatingJavaScriptFromString có vẻ là chủ đề riêng của nó mà không có cách nào để biết khi nào nó kết thúc (nó không gọi là webViewDidFinishLoad), cách duy nhất để ngăn chặn hoàn toàn người dùng nhấn nút Thoát mà tôi có thể thấy là chỉ cho phép tương tác người dùng trên UIWebView sau một số chậm trễ, đó là không đáng tin cậy (làm thế nào tôi có thể thực sự biết bao lâu để trì hoãn?).

Tôi có chính xác trong đó stringByEvaluatingJavaScriptFromString được thực hiện trên chỉ trên luồng và tôi không có cách nào để có thể biết khi nào nó kết thúc? Bất kỳ đề xuất nào khác về cách giải quyết vấn đề này?

EDIT: Nói tóm lại, những gì tôi muốn biết là nếu nó có thể vô hiệu hóa một UIWebView khi stringByEvaluatingJavaScriptFromString đang thực hiện, và hãy bật lại UIWebView khi javascript xong.

EDIT 2: Có một bài viết ở đây mà dường như ngụ ý bạn bằng cách nào đó có thể thăm dò ý kiến ​​các cơ JS để xem khi nó đã hoàn thành, nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo khác nói cùng một điều: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

EDIT 3 Dựa trên câu trả lời từ Brad Smith, có vẻ như tôi thực sự cần phải biết khi nào UIWebView đã tải xong sau khi javascript đã được thực hiện. Nó trông ngày càng nhiều hơn như tôi chỉ cần đặt một sự chậm trễ của các loại trong đó.

+2

cùng một vấn đề ở đây! Giải pháp của bạn là gì? –

+0

Tôi tin rằng tôi đã phải nghỉ mát để chỉ giả định rằng sẽ mất một khoảng thời gian nhất định và trì hoãn quá trình xử lý của tôi ít nhất khoảng thời gian đó. –

+1

Cùng một vấn đề. Ouch, phải có cách tốt hơn để làm điều này. –

Trả lời

2

Bạn có thể có javascript bạn đang tiêm vào trang, cố gắng điều hướng trang ở nơi khác (document.location = "foo") và sử dụng webView: ShouldLoadRequest: để tìm yêu cầu đó và trả lại không cũng như kích hoạt những gì bạn cần (và thường trở lại có).

+0

Hmm, thú vị. Âm thanh như một cách giải quyết khủng khiếp nhưng nó có thể chỉ hoạt động ... –

+0

Đáng buồn thay, điều này dường như không hiệu quả đối với tôi. Tôi tacked vào cuộc gọi document.location ở cuối javascript tôi đang tiêm, nhưng điều này vẫn có vẻ được gọi là trước khi nút Exit đã biến mất. Dường như JS đã được chạy, nhưng WebView đã không xử lý xong các thay đổi. –

1

stringByEvaluatingJavascriptFromString phải được thực hiện khi nó trở lại. Nó có thể được thực hiện trên một luồng khác (có lẽ không phải vì nó có thể thay đổi giao diện người dùng), nhưng phương thức này không thể trả về kết quả chuỗi cho đến khi nó có kết quả trả về.

+0

Có, tôi nhận ra rằng javascript không thể được thực hiện cho đến khi webview trở lại. Vui lòng xem câu hỏi đã chỉnh sửa của tôi để làm rõ những gì tôi đang yêu cầu. –

2

Sau khi thực hiện stringByEvaluatingJavascriptFromString, bạn có thể thử mã dưới đây để giải quyết vấn đề của bạn

webView.userInteractionEnabled = NO; 
while (webView.loading) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; 
} 
webView.userInteractionEnabled = YES; 

Hãy cho tôi biết làm việc của mình cho bạn hay không.

2

Cách nội tuyến hóa chức năng gốc cho sự kiện onclick trực tiếp trên phần tử html. Bạn có thể liên kết phần tử html với một hàm xử lý sự kiện onclick sau này khi nó thích hợp hơn.

<button onclick="function() { };"/> 
Các vấn đề liên quan