UIWebView и JavaScript - PullRequest
       8

UIWebView и JavaScript

1 голос
/ 06 мая 2010

Я обнаружил странное поведение UIWebView.

В делегате

- (void)webViewDidFinishLoad:(UIWebView *)webView{    
    [self changeFont];    
    //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changeFont) userInfo:nil repeats:NO];
}

В changeFont я вызываю javaScript для изменения шрифта веб-страницы. Он не будет применен, но если я вызову метод изменения шрифта через несколько секунд после делегата webViewDidFinishLoad, он будет применен. если файлы большого размера, как мы можем определить, сколько времени потребуется веб-просмотру для загрузки, если нам нужно запустить таймер из делегата webViewDidFinish, чтобы применить размер и стиль шрифта для файла.

любое объяснение этому. Я много разыскивал и ничего не упоминается в документах.

Любая помощь, почему такое поведение UIWebView?

Ответы [ 3 ]

1 голос
/ 08 мая 2012

Документ Apple объясняет, что webViewDidFinishLoad и webViewDidStartLoad будут вызваны после завершения / начала загрузки кадра
Таким образом, после вызова webViewDidFinishLoad (когда загружен базовый html), на странице все еще может выполняться JavaScript или Ajax. Вам нужно подождать, пока все они будут сделаны.

Я бы предложил два способа попробовать:

  1. добавить наблюдателя в свойство загрузки UIWebView
  2. привязка пользовательского JavaScript к странице, чтобы судить о событии, которое вы действительно хотите (например, все элементы загрузились), а затем использовать JavaScript для обратного вызова Objective-C

последний более мощный при работе с пользовательскими событиями. И этот вопрос, на который я ответил, может помочь:

  1. обнаружение события и обратного вызова проигрывателя YouTube с помощью UIWebView
  2. обратный вызов Javascript в Objective-C
0 голосов
/ 19 декабря 2011

Я думаю, это потому, что веб-страница может не отображаться полностью (я имею в виду все javascript, ресурсы и т. Д.) В тот момент, когда - (void)webViewDidStartLoad:(UIWebView *)webView метод сработал

Это объясняет, почему ваш метод работает второй раз после некоторой задержки .. (страница становится полностью загруженной)

Вы можете использовать обратный вызов из javascript для target-c, чтобы определить, закончился процесс рендеринга или нет, Более подробную информацию об этой функции (или небольшом взломе) вы можете найти в разделе: «Связь Javascript с кодом Objective-C» по ссылке http://www.codingventures.com/2008/12/using-uiwebview-to-render-svg-files/.

или используйте stringByEvaluatingJavaScriptFromString: - я привел пример использования этого в другой связанной теме https://stackoverflow.com/a/8560489/857417

0 голосов
/ 02 июня 2010

Попробуйте вызвать метод "changeFont" в главном потоке. Как [self executeSelectorInMainThread: ...];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...