2013-09-05 1 views
0

Например, я хочу, чтобы запустить эту часть кода каждый раз, когда пользователь нажимает новую ссылку на мой UIWebView,Run JS в IOS Webview каждый раз загрузки новой страницы

NSString* js = 
@"var meta = document.createElement('meta'); " 
"meta.setAttribute('name', 'viewport'); " 
"meta.setAttribute('content', 'width = device-width;initial-scale=1.0; maximum-scale=1.0'); " 
"document.getElementsByTagName('head')[0].appendChild(meta)"; 

[webView stringByEvaluatingJavaScriptFromString: js]; 

, как я могу это сделать? на какой API я должен смотреть? И я хочу, чтобы этот JS запускался на новой странице. Как определить, полностью ли загружена новая страница? -

ответ

1

Есть вероятность пойти не так в этом сценарии две вещи: 1) ваш Js бросает исключение и 2) страница перегружает после ваш Js, закончилась, и поэтому сброс эффектов вашего сценария.

В моем опыте, когда Javascript, кажется, не работает в UIWebView, это почти всегда Javascript, который бросает исключение.

Try окружающего сценария в try { ... } catch { ... } захватить исключение:

NSString* js = 
@"try {" 
"var meta = document.createElement('meta'); " 
    // [rest of the script...] 
"document.getElementsByTagName('head')[0].appendChild(meta)"; 
" } catch (exc) { " 
" window.ERR = exc.toString(); " 
" } " 

Теперь вы можете установить точку останова в Xcode после вызова stringByEvaluatingJavaScriptFromString:. Сообщение об ошибке может быть доступно, если вы запустите

po [webView stringByEvaluatingJavaScriptFromString:@"window.ERR"] 

В вашей подсказке отладки.

Хорошей идея, когда вы попробуете Javascript на вашем UIWebView является первым сделать разведочную работы в чем-то вроде Chrome Developer Tools отсеять худшие ошибки (например, ошибки синтаксиса). Если ваш код работает там, следующим шагом является подключение к просмотру с помощью Safaris Web inspector for iOS и посмотреть, все ли он делает то, что ему нужно.

@ nilveryboring указывает, что вы добавляете скрипты в webViewDidFinishLoading, а не в shouldStartLoadWithRequest. В shouldStartLoadWithRequest страница еще не загружена, и любое состояние, которое вы вводите в этот момент, будет отброшено на странице загрузки.

1

Вы можете определить, когда пользователь нажимает на ссылку с:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

После того, как вы обнаружили, что он нажал на ссылку, выполнить ваши JS.

Подробнее об этом в Docs.

+0

JS не работает на новой странице. Как определить, полностью ли загружена новая страница? – nilveryboring

+1

@nilveryboring Это все часть [UIWebView-протокола делегатов] (https://developer.apple.com/library/ios/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html). Чтобы обнаружить, когда UIWebView закончил загрузку, вы используете 'webViewDidFinishLoading'. Что касается того, почему фрагмент js не работает, я не совсем уверен (я не знаю jscript). Установите некоторые точки останова, чтобы увидеть, вызвана ли она. Кроме этого, проверьте код jscript и преобразование в NSString, чтобы убедиться, что вы делаете это правильно. Отвечает ли это на ваш вопрос? – CaptJak

+0

@nilveryboring, вам нужно открыть еще один вопрос? Вы хотите изменить свой вопрос? – CaptJak