Сбой всплывающих окон в JQueryMobile 1.3.2 после обновления Chrome версии 43.0.2357.65 м
Последняя хромовая версия "43.0.2357.65 м" сломала JQueryMobile 1.3.2 для кого-либо еще? Когда я нажимаю всплывающее окно, оно переходит в верхнюю часть страницы, и полоса прокрутки исчезает. Это было хорошо в предыдущей версии.
Проблема влияет на мое приложение, но воспроизводится на демонстрационных страницах JQueryMobile:
- Используя Chrome 43.0.2357.65 m, перейдите по ссылке http://demos.jquerymobile.com/1.3.2/
- Нажмите на всплывающее окно
- На всплывающей странице нажмите кнопку "Войти" в середине страницы.
- Он перейдет в верхнюю часть страницы, и полоса прокрутки исчезнет.
Обратите внимание, что это происходит не каждый раз - если вы попробуете это снова, это может сработать, но если вы начнете шаги со свежей вкладки, это будет происходить последовательно.
Я поднял проблему с Chrome, но мне просто интересно, знает ли кто-нибудь, что происходит, и есть ли обходной путь, который я могу реализовать.
Спасибо!
2 ответа
Всплывающее окно кажется странным, его трудно повторить - переход к точной ссылке ниже и последующее нажатие на указанную кнопку "войти", кажется, гарантируют поведение. http://demos.jquerymobile.com/1.3.2/widgets/popup/
Я полагаю, что приведенное ниже решение может быть связано с исправлением других забавных проблем с переходом между слайдами (только ограниченный тест с всплывающим окном), но выглядит многообещающе
Переопределение ошибочной функции с помощью фрагмента кода ниже. Вы должны позвонить, прежде чем загружать jquerymobile JS
// Override of $.fn.animationComplete muse be called before initialise jquery mobile js
$(document).bind('mobileinit', function() {
$.fn.animationComplete = function(callback) {
if ($.support.cssTransitions) {
var superfy= "WebKitTransitionEvent" in window ? "webkitAnimationEnd" : "animationend";
return $(this).one(superfy, callback);
} else {
setTimeout(callback, 0);
return $(this);
}
};
})
Справочная информация: jqueryMobile 1.3.2 реализует вложение обработчика событий jquery one() несколько неправильно.
.one () - "Присоединить обработчик к событию для элементов. Обработчик выполняется не более одного раза для каждого элемента для каждого типа события. ": http://api.jquery.com/category/events/: по сути, происходит событие и затем удаляется.
Однако вызов обоих ("webkitAnimationEnd and animationend") с использованием one () потенциально может означать, что только 1 (в зависимости от браузера) из двух обработчиков когда-либо срабатывает, оставляя другой слишком медленным и потенциально может вызвать утечку памяти.
Chrome43 обрабатывает как webkitAniationEnd, так и animationend, но только один в любой момент времени. Это заставляет другого задерживаться и запускаться при следующей анимации элемента.
Как обходной путь для меня, кажется, работает, если вы используете API jQueryMobile.
$('selector').popup('open');
вместо того, чтобы полагаться на разметку jQueryMobile
Моя версия Chrome "43.0.2357.81 м", и я тоже испытываю это