Определение завершения строки stringByEvaluatingJavaScriptFromString - PullRequest
13 голосов
/ 14 января 2011

У меня есть UIWebView, который загружает HTML-страницу. На этой странице есть две кнопки: «Выход» и «Отправить». Я не хочу, чтобы пользователи могли нажимать кнопку «Выход», поэтому после завершения загрузки страницы (т. Е. Вызывается webViewDidFinishLoad) я использую stringByEvaluatingJavaScriptFromString, чтобы удалить одну из этих кнопок, манипулируя HTML. Я также отключаю взаимодействие с пользователем на UIWebView на webViewDidStartLoad и включаю его снова на webViewDidFinishLoad.

Проблема, которую я обнаружил, состоит в том, что stringByEvaluatingJavaScriptFromString занимает секунду или две, чтобы завершиться, и, кажется, это делается в своем собственном потоке. Таким образом, происходит то, что вызывается webViewDidFinishLoad, на UIWebView включено взаимодействие с пользователем, и, если пользователь быстр, он может нажать кнопку «Выход» до завершения stringByEvaluatingJavaScriptFromString. Поскольку stringByEvaluatingJavaScriptFromString, кажется, находится в своем собственном потоке без возможности узнать, когда он закончил (он не вызывает webViewDidFinishLoad), единственный способ полностью запретить пользователям нажимать кнопку «Выход», которую я вижу, - это только включить взаимодействие с пользователем. в UIWebView после некоторой задержки, которая ненадежна (как я могу действительно знать, как долго задерживаться?).

Правильно ли я в том, что stringByEvaluatingJavaScriptFromString выполняется на нити, и я не могу сказать, когда она закончится? Любые другие предложения о том, как обойти эту проблему?

РЕДАКТИРОВАТЬ: Короче говоря, я хочу знать, можно ли отключить UIWebView во время выполнения stringByEvaluatingJavaScriptFromString и повторно включить UIWebView после завершения JavaScript .

РЕДАКТИРОВАТЬ 2: Здесь есть статья, которая, кажется, подразумевает, что вы можете каким-то образом опрашивать движок JS, чтобы увидеть, когда он закончится, но я не могу найти никаких других ссылок, говорящих то же самое: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

РЕДАКТИРОВАТЬ 3 Судя по ответу Брэда Смита, мне кажется, что мне действительно нужно знать, когда UIWebView завершил загрузку после выполнения JavaScript. Все больше и больше похоже на то, что мне просто нужно добавить отсрочку.

Ответы [ 4 ]

2 голосов
/ 21 февраля 2014

Как насчет встраивания функции-заглушки для события onclick непосредственно в элемент html. Вы можете связать элемент html с функцией-обработчиком события onclick позже, когда это будет более уместно.

<button onclick="function () { };"/>
2 голосов
/ 20 февраля 2014

После выполнения stringByEvaluatingJavascriptFromString вы можете попробовать следующий код для решения вашей проблемы

webView.userInteractionEnabled = NO;
while (webView.loading) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
webView.userInteractionEnabled = YES;

Дайте мне знать, работает он для вас или нет.

2 голосов
/ 14 января 2011

Вы можете иметь javascript, который вы вставляете на страницу, пытаться перемещаться по странице в другом месте (document.location = "foo") и использовать webView: ShouldLoadRequest: чтобы найти этот запрос и вернуть no, а также вызвать чтоВы должны (и обычно возвращаете да).

1 голос
/ 14 января 2011

stringByEvaluatingJavascriptFromString должно быть сделано, когда он вернется. Это может быть сделано в другом потоке (возможно, нет, поскольку он может изменить пользовательский интерфейс), но метод не может возвращать строковый результат, пока не получит результат для возврата.

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