JQuery Mobile-pageinit против PageShow
Я немного запутался в использовании этих методов. Я знаю, что pageinit вызывается во время инициализации, но pagehow вызывается каждый раз при отображении страницы.
У меня есть домашняя страница, которая загружает данные, используя $.ajax() для некоторых разделов. Я загружаю данные в Pageinit. Также привязываю события click и swipe только в pageinit. И также я заметил, что pageinit не вызывается, когда вы возвращаетесь с другой страницы.
Была еще одна проблема, когда мы использовали карусель с помощью swipe.js. Он не загружается должным образом, когда я использую метод pageinit. Но работает нормально при загрузке в методе pageshow. Что может быть причиной для вызова Pageinit, когда мы используем кнопку возврата браузера.
Кроме того, играет ли роль кэширования какую-либо роль в принятии решения о том, где разместить логику загрузки данных, события привязки и т. Д. Было бы лучше, если бы кто-то мог объяснить, скажем, загрузку данных домашней страницы, а затем навигацию и возврат с другой страницы.
1 ответ
вступление
Всю информацию, найденную здесь, также можно найти в моем блоге ARTICLE, вы также найдете рабочие примеры.
Разница между Pageinit и PageShow
Давайте начнем с самого начала. Как вы уже знаете, разработчики jQuery предоставили нам события страницы, чтобы заполнить пробел, который готовый документ не может выполнить. В то время как готовый документ может сказать вам, что контент готов внутри DOM, нам нужно больше, чем это, потому что jQuery Mobile все еще нуждается в улучшении разметки контента (улучшении стиля контента).
Есть несколько страниц событий, и у каждого из них есть своя цель. Некоторые срабатывают до того, как содержимое страницы может быть улучшено (например, pagebeforecreate), чтобы можно было добавить динамическое содержимое. Некоторые из них будут срабатывать только во время изменения страницы, например pagebeforechange.
Но позвольте как вернуться к вашему вопросу. Pageinit
здесь, чтобы быть jQuery Мобильная версия document ready
, Хотя вы все еще можете использовать document ready
все еще логично иметь такую же альтернативу среди событий страницы.
Как вы уже сказали, вы используете pageinit
для привязки событий (например, события щелчка или удара), и это хорошее решение. В основном потому что jQuery Mobile
страдает от проблемы, называемой "связывание нескольких событий". Если, например, у вас есть событие click, привязанное к элементу, ничто не может помешать другому событию click быть привязанным к тому же элементу. И это произойдет, если вы используете pageshow
событие. Если вы используете привязку событий во время pageshow
Событие, при каждом посещении страницы одно и то же событие будет связываться снова и снова. Это можно легко предотвратить, но это же предупреждение потребует дополнительной вычислительной мощности процессора, той же мощности, которая может использоваться для обработки остальных веб-приложений.
Здесь у нас есть еще один вопрос (один из ваших вопросов), какова цель pageshow
? Очевидный ответ - сделать что-то с доступной и показанной страницей. Хотя правильный ответ это не так важно. Pageshow
это важно, потому что это ТОЛЬКО событие страницы, где высота страницы может быть правильно рассчитана, и это не 0. Теперь вы можете видеть, почему ваша карусель должна быть инициализирована в этой точке. Карусели, как и многие другие плагины (диаграммы, галереи изображений), требуют правильной высоты страницы, и если вы инициализируете их раньше pageshow
они будут иметь высоту 0, поэтому они будут существовать, но вы не сможете их увидеть.
По поводу вашего последнего вопроса. Обналичивание не играет никакой роли, если ваше приложение построено правильно. Для начала вы всегда должны использовать делегированную привязку события, потому что не имеет значения, существует элемент страницы или нет. По сути, если вы привязываете свое событие к какому-либо родительскому элементу, например, документу, не имеет значения, была ли ваша страница удалена или удалена из DOM. Как только он вернется, это событие снова будет работать.
Пример:
$(document).on('click', '#some-button',function(){
});
Этот метод привязывает событие click к документу, но это же событие click будет работать только для элемента с идентификатором ' some-button'
, Это действительно не имеет значения, существует этот элемент или нет, потому что объект документа всегда будет существовать.
Эта же логика не так важна, если вы работаете с обычными веб-страницами, где перезагрузка / обновление страницы - обычное дело. Или даже здесь с jQuery Mobile, если ajax отключен, поэтому каждое изменение страницы - это обновление / перезагрузка страницы.
Я надеюсь, что это отвечает на все ваши вопросы. Если вам нужны пояснения, задайте их в разделе комментариев.
РЕДАКТИРОВАТЬ:
Где вы должны загрузить свои данные, зависит от того, что вам нужно загрузить. Если вы хотите сделать только один раз, используйте
pageinit
, Если вам это нужно при каждом посещении страницы, используйтеpagebeforeshow
(потому что если вы используетеpageshow
этот контент будет появляться из ниоткуда, и это может запутать пользователя). Не использоватьpagebeforecreate
потому что контент будет загружаться после окончания события, поэтому нет смысла его использовать.Если вы хотите загрузить контент через некоторый интервал, используйте
pageinit
с функцией setinterval. Не забывайте вручную улучшать стили содержимого страницы при каждом добавлении динамического содержимого.Pageshow
полезен только при инициализации плагина необходимая высота страницы. Ничего особенного. Из ответа 1 вы можете видеть, что это кровать для динамического контента, потому что он появится из ниоткуда.Pageinit
следует использовать для привязки событий и генерации динамического контента.Завтра я обновлю свой ответ с вариантами использования для каждого события страницы. Я надеюсь, что этого будет достаточно для вас.