Селектор jQuery не работает на Windows Phone 7 - PullRequest
4 голосов
/ 11 сентября 2011

У меня странная проблема с веб-приложением для WP7 (7.1).

Код, который работает с Chrome, Safari и т. Д.:

$.each(val, function(sub_key, sub_val) {

                $("."+sub_key).html(sub_val);                       

});

Примеры используемых переменных:

sub_key : title-home
sub_val : This is home

Это не работает на WP7 (v. 7.1). Я пробовал бесконечные комбинации, но единственный способ заставить селектор работать, это определить статическую строку внутри селектора. Вот так:

$.each(val, function(sub_key, sub_val) {

                $(".title-home").html(sub_val);                     

});

Это, конечно, не вариант. Есть ли какая-то ошибка в IE при соединении строк, как я сделал?

Кстати, я думаю, что WP7 использует движок IE 7.

Приветствия Johe

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

- редактировать: если у вас есть проблемы с тем, что на странице javascripts вообще не работает: обязательно проверьте мои выводы по теме, которую я разместил на http://social.msdn.microsoft.com/Forums/en-AU/jscript/thread/bac9f056-e0de-449e-a1b6-36e745fa59c6 - возможно, ваши проблемы связаны с некоторыминеудачные тайминги или упорядочение собственности.получается, что если вы жестко закодировали URL в XAML, то вы должны убедиться, что в этом XAML IsScriptEnabled установлен ДО свойства SOURCE, иначе у вас будет много сбоев, зависящих от того, какой тип документа имеют ваши страницы.То же самое относится к настройке Source или Navigate'ing в коде, но это довольно очевидно.с другой стороны, на первый взгляд, кажется, что привязки работают в любом случае правильно.- / edit

Это может быть не очень полезно для вас, но я все равно опубликую его, так как это может помочь многим другим людям с WP7 и jQuery:

Пожалуйста, убедитесь, что выиспользуют новейший JQ, который помечен его командой как ok-with-wp7.Недавно я взаимодействовал с веб-сайтом, на котором Pulisher постоянно перепутывал разные версии JQ.Из моих скромных экспериментов, только текущий jQuery 1.6.2 работал должным образом внутри элемента управления WebBrowser, также jQueryMobile работал хорошо.Версии 1.4.x и 1.5.x, которые обычно использовались на этом сайте, с которым я работал - совершенно не смогли разобрать где-то в основном скрипте jQ.js, сказав в скором времени - символы jQuery и $ были «неопределенными» после загрузки страницы.КСТАТИ.Если я правильно помню, это было на 7.0 (от MS: «что-то между IE7 и IE8») и на 7.1 (где-то подслушано: «что-то между IE8 и IE9») совместимость немного лучше, но не идеальная. Есливы можете сначала попробовать jQmobile.

О неудачном коде js - вы должны быть очень осторожны при сканировании страницы.Вы говорите о приложении WP7.1 - поэтому я предполагаю, что вы работаете внутри элемента управления WebBrowser.Если это так, то отрежьте свой JS-скрипт от страницы, скопируйте его в виде строки где-нибудь в вашем приложении, а затем, в WebBrowser.NavigationCompleted, попробуйте выполнить этот скрипт вручную через WebBroweser.InvokeScript.Если есть какая-то фактическая ошибка - вы получите исключение, наиболее вероятно "ComException 0x80020101. Вы знаете ... WebBrowser странен в этом, это его любимый код ошибки, возвращенный для очень многих различных причин ... в любом случае:

Если эта ошибка произойдет, JS мгновенно прервется, и ваш код получит только то, что вы сможете перехватить. Внутри этого, кроме объекта, вы не получите ... никакой информации. Жаль.Но с некоторыми хитростями вы можете поиграть в тральщик с кодом JS и сократить его до минимальных примеров, которые либо работают должным образом, либо аварийно завершают работу - и, возможно, вы поймете, что случилось.

Некоторые ошибки, например:
- попытка использовать имя, которое неизвестно, может вернуть «неопределенное», но также может привести к сбою, особенно в глобальном контексте
- попытка случайно привести к строковому форматированию window, window.external и других нативов, иногда может вызвать сбой
- попытка прикоснуться к телу документа, прежде чем он полностью загрузится, может привести к сбою
- ... и т. д.на.Обратите внимание, что «до загрузки страницы» - это только мое предположение.Я предполагаю, что вы пытаетесь поиграть со своей страницей ПОСЛЕ того, как вы получили событие 'webbrowser.navigated', так как это первая вменяемая точка, когда браузер уведомляет вас о загрузке страницы.Тем не менее, даже несмотря на это, вы все равно можете получить эту ошибку, и это может быть просто из-за несвоевременного выбора времени.Если вы попытаетесь вызвать точно такой же код чуть позже, вы можете преуспеть без каких-либо исключений.

Простите, но я повторю: в большинстве случаев, если что-то случится, вы получитеОшибка «Имя не найдено / COM0x80020101», из-за которой код или файл JS автоматически прерываются и пропускаются.Обычно это не означает, что означает имя исключения.Это просто общая ошибка в JS.Иногда вы получите несколько других исключений, но это 95% -5%.Btw.другие исключения, как правило, также содержат в себе довольно ненужные данные.

Теперь я упомянул некоторые уловки.

WebBrowser.InvokeScript - это ошибка ... скажем, недружественная для использования. Он предназначен только для вызова глобальных функций, зарегистрированных в JavaScript. InvokeScript имеет 2 перегрузки: (имя строки) и (имя строки, параметры объекта []) . Важно знать, , что первый параметр - это NAME функции. Это должно быть имя. Это не может быть произвольный код JS, InvokeScript ищет функции по имени, и если он не находит ни одной, выдается .. 0x80020101 :) Аргументы / строки - вы можете передавать все что угодно.

Я пишу все это, чтобы помочь вам с возможной ручной отладкой / разминированием кода JS. Если вы установите точку останова в обработчике событий WebBrowser.NavigationCompleted или где бы то ни было вызвано впоследствии, вы можете играть с JS в интерактивном режиме из окна наблюдения отладчика с помощью мощного трюка с одним, гарантированно существующим, js-core. функция: eval

Хотя InvokeScript может вызывать только функцию, выбранную по имени, с помощью функции «eval», вы можете выполнить совершенно произвольный код. Я (не один раз) вставил / оценил всю библиотеку JQuery1.6.2 на страницу, просто чтобы проверить, работает ли она, или поковыряться с содержимым на странице - потому что страница связана с ie. JQ1.4, который был сломан на WP7.

Имейте в виду, что, даже если foth из перегрузок InvokeScript утверждает, что возвращает «объект», не обманывайте себя этим. По крайней мере, играя с eval, они не могут этого сделать. Единственное, что они могут вернуть, это чистая строка. Что бы вы ни попытались вернуть, оно будет возвращено как "", пустая строка. Я проверил на 7.0, 7.1 и 7.5. Объект [] params тоже сомнителен. Мне удалось передать только строки.

примеров для ввода в окно Watch (при условии, что 'wb' - это элемент управления WebBrowser)

wb.InvokeScript("eval", " 'mom' "); // returns string, 'mom'
wb.InvokeScript("eval", " window "); // returns empty string
wb.InvokeScript("eval", " ' '+window "); // returns [object Object] -- note the ' '+ -- to stringify it before returning

wb.InvokeScript("window"); // 0x80020101
wb.InvokeScript(" 5+5 "); // 0x80020101 :)
wb.InvokeScript(" 'mom' "); // 0x80020101 :))
wb.InvokeScript("myfunction"); // 0x80020101 or calls your function from JS
wb.InvokeScript("function blah(){return 5+5}; ' '+blah() "); // 0x80020101

wb.InvokeScript("eval", " '5'+'5' "); // returns '55' - only with eval you may exec custom code
wb.InvokeScript("eval", "function blah(){return 5+5}; ' '+blah() "); // you can even define functions - returns 10
wb.InvokeScript("eval", " ' ' + blah() "); // what's more, whatever you do, it's permanent, functions is still there, returns 10

// JQ works too:
wb.InvokeScript("eval", " ' ' + $ "); // if you see" undefined", the JQ failed to load
wb.InvokeScript("eval", " ' ' + jQuery "); // the same as above
wb.InvokeScript("eval", myVariable_withCached_JQueryCoreCode); // works! (at least on 7.1 and JQ162)
wb.InvokeScript("eval", " ' ' + jQuery "); // jq dump, if it was loaded properly
wb.InvokeScript("eval", " ' ' + $ "); // the same
wb.InvokeScript("eval", " ' ' + $(document.body)[0] ");

последнюю строчку в моем случае иногда выкидывал, а иногда нет. Если он выдавал, я обычно мог повторно успешно вызвать его, например, через 250 мс, установленный с таймером _in_the_app_code_, но не смог сделать то же самое в setTimeout! Когда я пытался выполнить аналогичный отложенный вызов изнутри JS, это иногда работало, но иногда даже приводило к сбою всего приложения. Бьюсь об заклад, исключение составляло 80020101, но я просто разозлился из-за этого, потратив 5+ часов на то, чтобы отследить эту штуку .. Забавно, но если бы одна и та же строка ссылалась на document.head вместо document.body - исключений не было, никогда.

Я думаю, что я снова написал слишком много, извините за это:)

0 голосов
/ 27 сентября 2011

кетцалькоатль, две вещи:

  1. Откуда вы знаете, что версия JQuery подходит для Windows Phone? Я не видел ничего официального по этому поводу.
  2. Как насчет отладчика? Если я установлю точку останова в обработчике Navigated, страница, которую я хочу отобразить, не загружается правильно, и я не могу успешно использовать Часы.
...