Я работаю над мобильным веб-приложением, которое в основном автономно и связывается с сервером только при необходимости. В настоящее время используются следующие библиотеки:
- jQuery 1.6.4
- jQuery UI 1.8.3
- Модифицированная / исправленная версия jQTouch
Вплоть до выхода iOS 5 мы также использовали touchscroll.js, но он больше не нужен, поскольку Safari теперь поддерживает положение: фиксированная и встроенная прокрутка.
Начиная с выпуска iOS 5, казалось бы, наугад, возникает это исключение:
JavaScript: Error undefined JavaScript execution exceeded timeout
Как только оно поднято, Safari не будет выполнять JS-код, который выполняется в течение более очень короткого промежутка времени (скажем, 1 мс). Обновление страницы, переход на новую страницу или переход на новый домен не имеет никакого эффекта. Любой код JS, даже такой простой, как
for(var i = 0; i < 30; i++) ;
не будет выполняться браузером без возбуждаемого исключения. Единственный способ обойти это - принудительно убить Safari и перезапустить его. Я полагаю, что также возможно обернуть любой удаленный «тяжелый» код в приложении в window.setTimeout (..., 1) или использовать Web Workers для всего, кроме обновлений пользовательского интерфейса, но это не очень Хорошее решение, так как приложение довольно большое и потребует существенного переписывания.
Кто-нибудь сталкивался с этой проблемой раньше? Как бы вы пошли на отладку чего-то подобного, так как это не какой-то фрагмент кода, который, кажется, переводит Safari в это сломанное состояние, и это может произойти на первый взгляд случайно?
Я попытался выяснить время ожидания движка JS в мобильном Safari, выполнив следующие действия:
var start, end;
start = new Date();
try {
while(true);
} catch (ex) {
alert('test');
}
end = new Date();
console.log(Number(end) - Number(start) + 'ms');
К сожалению, это исключение тайм-аута не является исключением JS, поэтому его нельзя перехватить в блоке try / catch; однако кажется, что максимальный период ожидания составляет несколько секунд. Ни один из кода в нашем приложении не блокирует браузер / JS-движок на долгое время (так как он обеспечил бы ужасный UX), и большинство, если не все, вероятно, имеют время выполнения менее 300 мс (включая все, что является «сверхмощным»).