2012-02-20 5 views
4

загружает диалог jQueryMobile с помощью этого кода:Почему 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, что кажется ненужным и нарушает все. Кто-нибудь знает, почему это происходит? Должно ли диалоговое окно просто закрыться без перезагрузки вызывающей страницы?

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

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

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

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

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

ответ

0

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

1

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

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

+0

Я не использую страницу Обратный вызов. – offex

+0

Какой обратный вызов вы используете для инициализации страницы? Ваш вопрос несколько расплывчатый, и это трудно сказать, не видя код инициализации вашей страницы. – gabaum10

+0

Я не использую обратный вызов для инициализации страницы. Я не думаю, что для вас есть код инициализации страницы. Я на самом деле вижу такое же поведение на веб-сайте jQuery Mobile, поэтому я думаю, что это не то, что я делаю. – offex

1

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

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

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

+0

Спасибо за ваш ответ. Я попробовал диалог («закрыть»), и он дал мне то же самое.В моем диалоговом окне есть те же самые JavaScripts, что и вызывающая страница. Мы не вызываем reloadPage = true в любом месте. То же самое происходит на сайте мобильного сайта jquery: Перейти сюда - http://jquerymobile.com/demos/1.0.1/ Перейдите к разделу «Страницы и диалоги» - «Диалоги». Нажмите «Открыть диалог» на первой кнопке. Используйте firebug для просмотра вызовов ajax. Вы увидите, как ajax вызывает огонь, чтобы перезагрузить страницу при нажатии любой из кнопок. – offex

+0

Он отлично работает, если вы перейдете непосредственно к http://jquerymobile.com/demos/1.0.1/docs/pages/page-dialogs.html. – offex

+0

try $ .mobile.page.prototype.options.domCache = true; если ваша страница не находится в DOM, вы ее повторно извлечете - я проверил и подтвердил, что мы не перезагружаем страницу с этим значением. НО мы не устанавливаем это в true, и это нормально, потому что у нас есть код страницы, который нам нужно повторно запускать каждый раз, потому что наши данные очень динамичны. –

2

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

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

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

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

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

Причина

Это происходит потому, что JQuery мобильный держит только три страницы в DOM:

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

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

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

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

В этом порядке идей:

  • При входе в ваш «Домашняя страница» первая страница устанавливается на ваш «Домашняя страница».

  • Когда вы переходите на страницу «Страница, которая вызывает диалог», создается страница sencond, а третья - «Страница, вызывающая диалог».

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

+0

Потратив часы на то, чтобы сделать диалоги правильными, я сдался и решил сделать легкое решение, которое должно использовать ссылку не ajax на страницу, которая вызывает диалог: ... работает, несмотря на то, что это не решение, , – JeyDotC

Смежные вопросы