JavaScript сломан в обратном вызове UIWebView «Начальная загрузка» - PullRequest
6 голосов
/ 18 августа 2010

Я пытаюсь выполнить JS до того, как сработает событие onLoad страницы.

Но у меня возникают проблемы с успешным вызовом stringByEvaluatingJavaScriptFromString в методе делегата webViewDidStartLoad.

Чтобы воспроизвести проблему, вы можете использовать следующий код.

Реализация делегата:

-(void)webViewDidStartLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"window.valueHasBeenSet=true"];
}

Просмотреть этот HTML-код:

<html>
<head></head>
<body>

<script type="text/javascript" charset="utf-8">
    if (window.valueHasBeenSet)
    {
        // We enter this branch the first time
        document.write('<h3>Everything is OK. Value has been set.</h3>');
    }
    else
    {
        // We incorrectly enter this branch on reloads
        document.write('<h3>Error. Value has not been set.</h3>');
    }
</script>

<a href="javascript:window.location.reload()">Reload</a>

</body>
</html>

Эта страница работает в первом представлении («Все в порядке.»), Но происходит сбой при всех перезагрузках, независимо от способа перезагрузки.Как и следовало ожидать, это также не работает в делегате shouldStartLoadWithRequest.

Я также попытался выполнить javascript сразу после webViewDidStartLoad с performSelector:withObject:afterDelay:0, но безрезультатно.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

Мне удалось заставить его работать, используя NSTimer

- (void)viewDidLoad {
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(update) userInfo:nil repeats:YES];
}

-(void)update{
    if (Progress.progress <= 1.0) {
        [website stringByEvaluatingJavaScriptFromString:@"window.valueHasBeenSet=true"];
    }
}
0 голосов
/ 14 ноября 2010

Вы должны сделать что-то вроде этого:

Реализация делегата:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"webViewDidFinishLoad");
    [webView stringByEvaluatingJavaScriptFromString:@"foo(true);"];
}

.html файл:

<html>
<head></head>

<script type="text/javascript" charset="utf-8">
function foo (value) {
    if (value)
    {
        // We enter this branch the first time
        document.write('<h3>Everything is OK. Value has been set.</h3>');
    }
    else
    {
        // We incorrectly enter this branch on reloads
        document.write('<h3>Error. Value has not been set.</h3>');
    }

    document.write('<a href="javascript:window.location.reload();">Reload</a>');
}
</script>
<body>



</body>
</html>
...