在webView中离开主页后,jQuery Mobile不会触发webViewDidStartLoad和webViewDidFinishLoad

时间:2012-07-24 13:35:58

标签: objective-c xcode ios5 jquery-mobile uiwebview

我有一个简单的iOS应用程序,其中包含一个包含UIWebView的单个视图。在我的webView中,我显示了我的jQuery Mobile网站。

由于jQuery Mobile通过ajax加载页面,因此在初始页面加载后不会调用webViewDidStartLoadwebViewDidFinishLoad方法。我在SO上发现了类似的问题,例如 this one ,但我不确定在哪里使用window.location = "localFunction"来电,还没有人确认这实际上有效

这是我的问题(例子):

  1. App Starts
  2. shouldStartLoadWithRequest被称为
  3. 调用
  4. webViewDidStartLoad,并显示网络活动指示符。
  5. webViewDidFinishLoad被调用,网络活动指示器被隐藏,webView显示初始网页。
  6. 用户点击主页上的链接
  7. shouldStartLoadWithRequest被称为
  8. 显示第二页,但webViewDidStartLoadwebViewDidFinishLoad的持续时间不再被调用 会话。
  9. 有没有办法强制jQuery Mobile或iOS应用程序调用{​​{1}}和webViewDidStartLoad,以便我可以执行一项简单的任务,例如在webViewDidFinishLoad时显示网络活动指示符被调用,并在调用webViewDidStartLoad时隐藏它?

3 个答案:

答案 0 :(得分:1)

如果您想发出UIWebView页面更改的信号;您可以使用自定义方案启动选项,如问题中的SO帖子所述。

window.location处理程序中定义pagebeforechange更改:(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);
});

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; 
    }
}

答案 1 :(得分:0)

webViewDidStartLoadwebViewDidFinishLoad仅在window.location更改时调用。 UIWebView无法拦截Ajax调用。

您可以通过使用ajaxEnabled="false"设置data-ajax="false"或单个网页/链接来全局关闭JQM的Ajax导航。

OR

如果问题只是显示活动指标;您可以通过调用$.mobile.showPageLoadingMsg来使用JQM的内置活动指示器。

答案 2 :(得分:0)

jQuery Mobile网站呈现页面的方式存在问题。如果您禁用网站的ajax导航,他们会被调用。使用Ajax ENABLED时,单击链接时永远不会调用webViewDidStartLoad,因为通过Ajax请求页面,窗口位置不会更改,因此iOS不会注册页面更改或页面加载。