1

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

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

这是我的问题(示例):

  1. 应用程序启动
  2. shouldStartLoadWithRequest叫做
  3. webViewDidStartLoad被调用,并显示网络活动指示器。
  4. webViewDidFinishLoad被调用,网络活动指示器被隐藏,webView 显示初始网页。
  5. 用户点击主页上的链接
  6. shouldStartLoadWithRequest叫做
  7. 显示第二页,但在会话webViewDidStartLoad期间 webViewDidFinishLoad不会再次调用。

有没有办法强制 jQuery Mobile 或 iOS 应用程序调用webViewDidStartLoadwebViewDidFinishLoad以便我可以执行简单的任务,例如在调用时显示网络活动指示器webViewDidStartLoad,并在调用时隐藏它webViewDidFinishLoad

4

3 回答 3

1

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

window.location在处理程序中定义更改pagebeforechange:(JQM 页面更改事件

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

在你的拦截这个custom-url-schemeshouldStartLoadWithRequest

- (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; 
    }
}
于 2012-07-24T14:48:40.387 回答
0

webViewDidStartLoad并且webViewDidFinishLoad仅在window.location更改时调用。UIWebView无法拦截 Ajax 调用。

您可以通过设置全局关闭 JQM 的 Ajax 导航,也可以ajaxEnabled="false"使用data-ajax="false".

或者

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

于 2012-07-24T13:50:59.187 回答
0

这是 jQuery Mobile 站点呈现页面的方式的问题。如果您禁用网站的 ajax 导航,它们会被调用。启用 Ajax 后,单击链接时不会调用 webViewDidStartLoad,因为由于页面是通过 Ajax 请求的,因此窗口位置不会更改,因此 iOS 不会注册页面更改或页面加载。

于 2012-07-25T02:20:25.440 回答