Почему jQueryMobile перезагружает страницу при закрытии диалога? - PullRequest
4 голосов
/ 20 февраля 2012

Я загружаю диалоговое окно jQueryMobile, используя этот код:

<a data-rel="dialog" href="/path/to/dialog?arg1=val1" data-theme="b" id="deleteButton" class="ui-btn-right home" data-direction="reverse" data-transition="slidedown">Delete</a>

Мой диалог содержит две кнопки:

<a data-role="button" href="/path/to/page/that/showed/dialog" id="deleteAddressButton" data-rel="back">Delete</a>
<a data-role="button" data-theme="a" href="/path/to/page/that/showed/dialog" data-rel="back">Cancel</a>

Когда я нажимаю кнопки, диалоговое окно закрывается и возвращается на страницу, котораяоткрыл диалог.Однако страница, открывающая диалоги, перезагружается через ajax, который кажется ненужным и ломает вещи.У кого-нибудь есть идеи, почему это происходит?Разве диалог не может закрываться без перезагрузки вызывающей страницы?

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

Домашняя страница-> Страница, которая вызывает диалог -> Диалог

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

Редактировать: это также происходит на сайте документации jQuery Mobile.Чтобы увидеть это:

  1. Перейдите к http://jquerymobile.com/demos/1.0.1/
  2. Перейдите к «Страницы и диалоги»
  3. Перейдите к «Диалоги»
  4. Нажмите напервая кнопка «Открыть диалог».
  5. Используйте Firebug или что-то подобное для просмотра вызовов Ajax.
  6. Закройте диалоговое окно, используя любую кнопку.
  7. Обратите внимание, что вызовы Ajax запускаютсяперезагрузить страницу вызова.

Ответы [ 5 ]

3 голосов
/ 07 ноября 2012

Кажется, это ошибка, и я открыл проблему для jquery-mobile на github вместе с патчем.

2 голосов
/ 24 марта 2012

Редактировать

Простое решение - использовать не-ajax-ссылку для страницы, вызывающей диалоговое окно

<a href="url/to/page-that-calls-dialog" data-ajax="false">...</a>

, которая работает за счет потерикэш DOM и необходимость перезагрузить всю страницу.

Похоже, мы должны подождать, пока jQuery не даст правильное поведение диалоговому виджету.

Причина

Это происходит потому, что jQuery mobile хранит только три страницы в DOM:

  1. Страница, которая была загружена впервые (Домашняя страница в вашем случае).
  2. Переходpage (страница с анимацией 'loading').
  3. Страница, на которую вы переходите (в данном случае это диалоговая страница).

Первая из них живет до тех пор, пока вы не выполнитенавигация без ajax (например, обновите браузер или введите URL, а затем нажмите ввод), если это так, новая становится первой страницей.

Вторая появляется только при переходе на другую страницу и живеттот же промежуток времени, что и первый.

третий всегдаs содержит новую страницу, к которой вы переходите, и (здесь это «магия тролля») она заменяется каждый раз, когда вы переходите с помощью ajax .

В таком порядке:

  • Когда вы заходите на "Домашнюю страницу", первая страница становится вашей "Домашней страницей".

  • Когда вы переходите на свою "Страницу"это вызывает диалог "вторая страница создана, а третья установлена ​​на" Страница, которая вызывает диалог ".

  • Когда вы вызываете свой диалог, это заменяет предыдущую третью страницу, поэтому ваш«Страница, которая вызывает диалог» удаляется из DOM.

1 голос
/ 21 февраля 2012

Редактировать

Это делает трюк, и убедитесь, что вы используете $ ('# yourDialog'). Dialog ('close') $.mobile.page.prototype.options.domCache = true;

Я могу подтвердить, что, хотя при закрытии диалогового окна, как и ожидалось, запускается только показ страниц, jQM по-прежнему выполняет запрос AJAX для страницы.Было бы неплохо, если бы это был не единственный путь, но пока все выглядит так, как будто это так.

1 голос
/ 20 февраля 2012

Вы что-нибудь делаете в обратном вызове "pageShow"? Потому что это, вероятно, то, что вызывает это. Событие pageShow будет запущено снова, как только вы скроете диалог.

Если вы не хотите, чтобы он показывался, вам нужно либо реструктурировать свой код для соответствующей обработки, либо использовать "pageLoad" вместо показа страницы. Вот ссылка на документы JQM, описывающие это поведение: http://jquerymobile.com/test/docs/api/events.html

0 голосов
/ 20 февраля 2012

Сайт jQuery Mobile делает то же самое, поэтому поведение по умолчанию должно быть.

...