Windows Phone 7 - прерывистое выполнение JavaScript в WebBrowser - PullRequest
1 голос
/ 21 сентября 2011

Я поигрался с бета-версиями API PhoneGap для WP7 - и обнаружил, что выполнение моего JavaScript-кода происходит с перебоями. В качестве тестового примера я создал простое приложение, отличное от PhoneGap, и все еще см. Периодически возникающие проблемы.

У меня есть браузер:

    <phone:WebBrowser x:Name="GapBrowser" 
                      Loaded="GapBrowser_Loaded" 
                      IsScriptEnabled="True" />

И установите его содержимое в коде:

    private void GapBrowser_Loaded(object sender, RoutedEventArgs e)
    {
        GapBrowser.NavigateToString(@"
                <!doctype html>
                <html>
                <body>
                    Hello world
                    <div id='welcomeMsg'></div>
                    <script type='text/javascript'>
                        document.getElementById('welcomeMsg').innerHTML += 'Script has executed!';
                    </script>
                </body>
                </html>
                ");
    }

Этот код должен отображать статическое сообщение «Hello world», а когда скрипт выполняется, добавляется «Script execute!».

Иногда (на самом деле довольно часто), без видимой причины, код JavaScript не выполняется. Кто-нибудь еще наблюдал эту проблему? Это ошибка или есть какое-то другое событие жизненного цикла, которое мне нужно рассмотреть?

Я использую эмулятор Манго для своих тестов.

(Мэтт Лэйси - я ищу ответы на этот вопрос!)

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Я не встречал такого поведения раньше, но тот факт, что вы не полагаетесь на какое-либо обнаружение того, что документ "готов" или DOM полностью загружен, является для меня самым большим красным флагом.

Из интереса вы также видите это, когда загружаете документ по телефону Navigate()?
Что делать, если у вас есть обработчик событий, который при ошибке обращается к управляемому коду? (Поскольку в такой ситуации вы ничего не могли отобразить в интерфейсе пользователя.)

0 голосов
/ 31 октября 2011

Идея, на которую указал Мэтт, великолепна - и, вероятно, верна, и я думаю, что она запустит ваш скрипт.

Но, если это не так, тогда я все же думаю, что ваш скрипт вызывается слишком быстро, но по какой-то другой причине.

Встроенные сценарии выполняются (почти) сразу же после того, как их заметили, а компонент WebBrowser имеет ошибку / особенность ... возможность касаться элемента BODY только после определенного небольшогопериод времени после загрузки документа.Я написал об этом в другом месте, я могу предоставить вам ссылку, если вы заинтересованы.Эта проблема возникает в основном при попытке InvokeScript с помощью обработчика событий Navigated, но я предполагаю, что это какая-то общая внутренняя проблема гонки где-то в браузере, поэтому, вероятно, это может относиться и к вашему случаю.

Если проблема возникает,ваши сценарии вызовут исключение COM при касании элемента BODY.Если это сделано в InvokeScript - вы будете уведомлены о некрасивом и совершенно бессмысленном исключении.Но если это происходит в сценарии - например, автоматическое срабатывание при загрузке тела или в каком-либо обратном вызове JavaScript-Timer - тогда браузер погасит исключение и молча прекратит выполнение сценария.К сожалению, если это произойдет, единственный способ «обойти» это обнаружение проблемы и повторение / задержка вызова - или искусственная задержка вызова примерно на 125-250 мс, и я имею в виду, внешне, а не JS-Timer, какJS-Timer поймает «сломанную» (или, скорее, не готовую) ссылку на тело в закрытии.Это случилось со мной ровно один раз в OS7.5.

Кроме того, вы можете попробовать переместить IsScriptEnabled = true в качестве первого имени сразу после x: имени.Это может звучать глупо, но, поверьте мне, WebBrowser также может иметь проблемы с этим.Я тоже могу указать вам ссылку, но сейчас она в основном не имеет значения, пожалуйста, проверьте ее, чтобы быть уверенным.Я почти уверен, что ваш обработчик событий Loaded вызывается с правильным временем, но если по какой-то причине это не так - это мгновенно волшебным образом решит проблему.

// edit: в комментарии, которые я добавил кMatt's:

<WebBrowser (....) ScriptNotify="script_msg_handler" />

обработчик:

private void script_msg_handler(object sender, NotifyEventArgs e)
{
    System.Diagnostics.Debugger.WriteLine("WebBrwNotify:{0}", e.Value);
}

и измените скрипт на:

window.external.notify("0001");
var d = document;
window.external.notify("0002");
var elem = d.getElementById('welcomeMsg');
window.external.notify("0003");
elem.innerHTML += 'Script has executed!'
window.external.notify("0004");

Проверка окна вывода для таких журналов отладки покажет вам,скрипт вызывается вообще, и какая его часть вызвала сбой.Однако вы все равно не сможете точно определить причину, поскольку некоторые исключения исключаются из браузера native .

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