Подтвердить что ты не робот

Как изменить историю мобильных jQuery Назад поведение кнопки

Я начну с этого, я немного научился, но решение, которое решает, похоже, должно быть простой модификацией JQM.

У меня есть веб-приложение для проверки вина, которое имеет следующий поток пользователей просмотра: http://5buckchuck.com/

Тип винa > Винная картa > Информация о винах > Обзор вин (перенаправление через back-back) > Информация о винах, обновленная из обзора

То, что я хочу сделать, - это когда пользователь нажимает кнопку "Назад" , он должен вернуться к списку вин. В настоящее время происходит просмотр загрузки Wine Detail. Он возвращается три раза назад, чтобы вернуться к списку вин.: - (

Мои мысли решить это были два:

  • Соедините последние 3 элемента из стека истории, если последние элементы в стеке истории были просмотрены Wine. Мне было трудно попытаться представить последний объект истории, чтобы получить страницуURL. У меня есть ощущение, что это решение немного хрупко, хотя.

    var last_hist = $.mobile.urlHistory.getActive();
    last_hist.data.pageURL;
    
  • Вторая мысль заключалась в том, чтобы переопределить поведение кнопки "Назад" , чтобы кнопка "Назад" в представлении "Винная деталь" всегда возвращалась в вид списка вин.

    $('div#wine_detail').live('pageshow',function(event, ui){      
      $("a.ui-btn-left").bind("click", function(){
        location.replace("/wines/{{wine.wine_type}}/#");
      });   
    });
    

Вероятно, есть лучший способ сделать это, но я немного из идей.

Обновление: Поэтому я продолжаю взламывать это с незначительными результатами. На том, что я нашел, это то, что я в основном должен работать: window.history.go(-3)

с консоли он делает именно то, что мне нужно.

Итак, я попробовал привязать его к задней кнопке:

$('div#wine_detail').live('pageshow',function(event, ui){
  var last = $.mobile.urlHistory.stack.length - 1;
  var last_url = $.mobile.urlHistory.stack[last].url;
  var review_url = /review/g;
   if (last_url.match(review_url) )
     {
       $('div#wine_detail a.ui-btn-left').bind( 'click', function( ) {  
         console.log("click should be bound and going back in time...")
         window.history.go(-2);
         });
   }
   else
   {
     console.log('err nope its: ' + last_url);
   }
 });

Нет кубиков, что-то перехватывает транзакцию...

4b9b3361

Ответ 1

Хорошо, поэтому решение было близко к обновлению, которое я опубликовал. Проблема с предыдущим решением заключалась в том, что многие кнопки привязывались к кнопке "Назад". Хотя мое новое действие привязки, возможно, работало иногда, другие действия также имели место, я пробовал unbind(), но все же не работал.

Мое решение - это немного дыма и зеркал. Я проверяю, была ли предыдущая страница страницей просмотра, а затем, если это так, я поменяю прежнюю кнопку возврата для моей новой кнопки faux со следующим шагом истории:

$('div#wine_detail').live('pageshow',function(event, ui){
  var last = $.mobile.urlHistory.stack.length - 1;
  var last_url = $.mobile.urlHistory.stack[last].url;
  var review_url = /review/g;
  if (last_url.match(review_url) )
    {
      $('a.ui-btn-left').replaceWith('<a href="" id="time_machine" class="ui-btn-left ui-btn ui-btn-icon-left ui-btn-corner-all ui-shadow ui-btn-up-a" data-icon="arrow-l"><span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Back</span><span class="ui-icon ui-icon-arrow-l ui-icon-shadow"></span></span></a>');

      $('#time_machine').bind( 'click', function( ) {  
        console.log("click should be bound and going back in time...")
        window.history.go(-3);
        });
    }
  else
    {
      console.log('err nope its: ' + last_url);
    }

Это выглядит точно так же, и никто не мудрее. его можно было бы улучшить, используя метод jQm pagebeforeshow, чтобы пользователь не мог видеть своп. Надеюсь, это поможет кому-то.

Ответ 2

Я бы предпочел не объединять/поп/толчок с urlHistory. Как насчет переадресации на pagebeforechange следующим образом:

$(document).on("pagebeforechange", function (e, data) {

    var overrideToPage;

    // some for-loop to go through the urlHistory TOP>DOWN
    for (var i = $.mobile.urlHistory.activeIndex - 1; i >= 0; i--) {
        // this checks if # = your target id. You probably need to adapt this;
        if ($.mobile.urlHistory.stack[i].url = $('#yourPageId').attr('id')) {
            // save and break
            overrideToPage = $.mobile.urlHistory.stack[i].url;
            break;
        }
        // set new Page
        data.toPage = overrideToPage;
    }
});

Это фиксирует ваш звонок на кнопке changePage и перенаправляет на нужную страницу. Вы также можете просто установить data.toPage = winelist напрямую.

Я делаю это только С# внутренними страницами, но не так сложно установить это с помощью winelist.html и т.д.

Для получения дополнительной информации проверьте страницу событий в JQM docs

Ответ 3

Почему у вас нет кнопки "Назад" в разделе заголовка вашей страницы? Что-то вроде этого:

<div data-role="header">
    <a data-direction="reverse" data-role="button" href="#winelist" data-icon="back">Back</a>
    <h1>Wine Detail</h1>
</div><!-- /header -->

Ответ 4

Я тоже боролся с этим недавно. Подумав об этом, я понял, что могу переписать приложение JQM для использования "всплывающих окон" для тех страниц, которые мне не нужны в моей истории. Это стало проще и чище, чем обманывать историю браузеров.

Теперь пользователи могут интуитивно использовать кнопку "Назад" браузера, и мне не нужно закодировать обратные кнопки приложения.

Единственное, что вы должны убедиться, это то, что всплывающие окна сами не попадают в историю браузера, поэтому обязательно установите для параметра "история" значение false:

$('#some_popup').popup( { history: false } );

Ответ 5

Если у вас есть ситуация, когда кнопка закрытия ссылается на произвольную (не последнюю) страницу, вы также можете перенести ее на целевую страницу и затем открыть диалог. Поэтому кнопка закрытия в диалоговом окне откроет целевую страницу.

// First: change to the target page
$.mobile.changePage('#target_page');

После этого откройте диалоговое окно, подобное этому.

// Second: change to the dialog 
window.setTimeout(
   // for some reason you have to wrap it in a timeout  
   function(){
      $.mobile.changePage('#dialog');
   },
   1
);

Теперь вы можете открыть диалоговое окно, и кнопка закрытия откроет #target_page.

Преимущества:

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

Ответ 6

Я видел подобные проблемы до использования jQuery mobile, и он рассматривается в документации. При настройке своего Javascript "в начале вашей страницы" используйте pageinit вместо того, чтобы готово или, возможно, в вашем случае делать страницы. Я думаю, что это будет решать вашу проблему без необходимости обхода очереди истории.