jQuery Mobile НЕ запускает webViewDidStartLoad и webViewDidFinishLoad после выхода с домашней страницы в webView

У меня есть простое приложение для iOS с одним представлением, которое содержит UIWebView. В моем webView я показываю свой веб-сайт jQuery Mobile.

Поскольку jQuery Mobile загружает страницы через ajax, webViewDidStartLoad а также webViewDidFinishLoad методы НЕ вызываются после загрузки начальной страницы. Я нашел похожие вопросы на SO, такие как этот, но я не уверен, где использовать window.location = "localFunction" позвоните, и еще никто не подтвердил, что это действительно работает.

Вот моя проблема (пример):

  1. Приложение запускается
  2. shouldStartLoadWithRequest называется
  3. webViewDidStartLoad и индикатор активности сети отображается.
  4. webViewDidFinishLoad вызывается, индикатор сетевой активности скрыт, а webView отображает начальную веб-страницу.
  5. Пользователь нажимает на ссылку с домашней страницы
  6. shouldStartLoadWithRequest называется
  7. Вторая страница отображается, но webViewDidStartLoad а такжеwebViewDidFinishLoad не вызывается снова на время сеанса.

Есть ли способ заставить jQuery Mobile или приложение для iOS звонить webViewDidStartLoad а также webViewDidFinishLoad так что я могу сделать простую задачу, например, показать индикатор сетевой активности, когда webViewDidStartLoad называется, и скрыть это, когда webViewDidFinishLoad называется?

3 ответа

Решение

Если вы хотите подать сигнал 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);
});

Перехватите эту пользовательскую 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; 
    }
}

Это проблема способа отображения страниц на сайте jQuery Mobile. Они будут вызваны, если вы отключите ajax-навигацию для сайта. С Ajax ENABLED webViewDidStartLoad никогда не вызывается при нажатии на ссылку, потому что, поскольку страница запрашивается через Ajax, расположение окна не меняется, и, следовательно, iOS не регистрирует изменение страницы или загрузку страницы.

webViewDidStartLoad а также webViewDidFinishLoad вызывается только когда window.location изменения. UIWebView не может перехватить вызовы Ajax.

Вы можете отключить Ajax-навигацию JQM - глобально, установив ajaxEnabled="false" или отдельные страницы / ссылки, использующие data-ajax="false",

ИЛИ ЖЕ

Если проблема просто показывает индикатор активности; Вы можете использовать встроенный индикатор активности JQM, вызывая $.mobile.showPageLoadingMsg,

Другие вопросы по тегам