2012-07-24 53 views
1

我有一個包含UIWebView的單一視圖的簡單iOS應用程序。在我的webView中,我顯示了我的jQuery Mobile網站。jQuery Mobile在webView離開主頁後不會觸發webViewDidStartLoad和webViewDidFinishLoad

由於jQuery Mobile通過ajax加載頁面,因此在加載初始頁面後不會調用webViewDidStartLoadwebViewDidFinishLoad方法。我在SO上發現了類似的問題,例如this one,但我不確定在哪裏使用​​調用,並且還沒有人確認這個實際工作。

這裏是我的問題(舉例):

  1. 應用程序啓動
  2. shouldStartLoadWithRequest
  3. webViewDidStartLoad被調用,網絡活動指示燈顯示。
  4. webViewDidFinishLoad被調用,網絡活動指示器被隱藏,並且webView顯示初始網頁。
  5. 用戶單擊主頁
  6. shouldStartLoadWithRequest
  7. 顯示第二頁,但webViewDidStartLoadwebViewDidFinishLoad的鏈接不爲 會議期間再次調用。

有沒有辦法迫使jQuery Mobile的或iOS應用調用webViewDidStartLoadwebViewDidFinishLoad,使我可以做一個簡單的任務,如顯示網絡活動指示燈,當webViewDidStartLoad被調用,並且隱藏在webViewDidFinishLoad是叫什麼名字?

回答

1

如果要發信號通知UIWebView頁面更改;您可以使用自定義方案啓動選項,如問題中SO帖子中所述。

定義在pagebeforechange處理程序window.location變化:(JQM Page change events

logToIosConsole: function(msg){ 
    console.log("logToIosConsole: log://"+msg); 
    var standalone = window.navigator.standalone, 
    userAgent = window.navigator.userAgent.toLowerCase(), 
    safari = /safari/.test(userAgent), 
    ios = /iphone|ipod|ipad/.test(userAgent); 

    if(ios) { 
     if (!standalone && !safari) { 
      //uiwebview 
      window.location = "log://"+msg; 
     }; 
    } else { 
     //not iOS 
    }; 

使用它在JavaScript

$(document).on("pagebeforechange", function(eve, ui){ 
    logToIosConsole("pagebeforechange called on "+eve.currentTarget.URL); 
}); 

攔截這個自定義的URL的方案在shouldStartLoadWithRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSString *theAnchor=[[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ; 
    if([theAnchor hasPrefix:@"log:\/\/"]) { 
     NSString *logText=[theAnchor substringFromIndex:@"log:\/\/".length]; 
     NSLog(@"LogMsg==>%@",logText); 
     return NO; 
    } 
} 
+0

啓用ajax後,即使使用「mylog」,「webViewDidStartLoad」函數仍未被調用。 – adamdehaven 2012-07-24 15:04:25

+0

用我當前項目的代碼進行了更新,其中我從JS登錄到Xcode控制檯... – 2012-07-25 12:15:00

+0

您能否簡單介紹一下這將做什麼? (提前致謝) – adamdehaven 2012-07-25 12:32:33

0

webViewDidStartLoadwebViewDidFinishLoad僅在window.location更改時纔會調用。 UIWebView無法攔截Ajax調用。

您可以通過設置ajaxEnabled="false"或單獨使用data-ajax="false"的頁面/鏈接來全局關閉JQM的Ajax導航。

OR

如果問題簡單地示出了活動的指標;您可以通過調用$.mobile.showPageLoadingMsg來使用JQM的內置活動指標。

+0

感謝您的快速響應......我的JQM活動指示器顯示,我只是想調用我的應用程序中的其他東西,將由'webViewDidStartLoad'和'webViewDidFinishLoad'方法調用。所以關閉ajax導航是唯一的解決方法?我會盡快嘗試...... – adamdehaven 2012-07-24 13:58:42

0

是的jQuery Mobile站點呈現頁面的方式存在問題。如果您禁用該站點的Ajax導航,它們會被調用。使用Ajax ENABLED時,webViewDidStartLoad在單擊鏈接時不會被調用,因爲由於通過Ajax請求頁面,所以窗口位置不會更改,因此iOS不會註冊頁面更改或頁面加載。

相關問題