【问题标题】:How to modify jQuery mobile history Back Button behavior如何修改 jQuery 移动历史后退按钮行为
【发布时间】:2012-05-03 00:10:16
【问题描述】:

我会先研究一下,但没有解决方案可以解决看起来应该是简单的 JQM 修改的问题。

我有一个葡萄酒评论网络应用程序,它具有以下视图用户流程: http://5buckchuck.com/

葡萄酒类型 > 酒单 > 葡萄酒详情 > 葡萄酒评论(通过 django backto 重定向)> 葡萄酒详情从评论更新

我想要发生的是,当用户按下后退按钮时,它应该返回到酒单。当前发生的是 Wine Detail 视图被重新加载。需要按三下才能回到酒单。 :-(

我解决这个问题的想法有两个:

  1. 如果历史堆栈中的最后一项是 Wine Review,则拼接历史堆栈中的最后 3 个项目。我很难自省最后一个历史对象以获取 pageURL。我感觉这个解决方案有点太脆弱了。

    var last_hist = $.mobile.urlHistory.getActive();
    last_hist.data.pageURL;
    
  2. 第二个想法是覆盖后退按钮的行为,以便 Wine Detail 视图中的后退按钮始终返回到 Wine 列表视图

    $('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);
   }
 });

没有骰子,交易中断了……

【问题讨论】:

    标签: javascript django jquery-mobile browser-history


    【解决方案1】:

    我不希望与 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

    我只对#internal 页面执行此操作,但使用 winelist.html 等进行设置应该不难。

    更多信息,请查看JQM中的活动页面docs

    【讨论】:

    • 感谢经常结帐很快!我也喜欢不混淆历史的想法。
    • 感谢 agian 的回答我注意到代码中有几件事。 if 有一个比较而不是赋值运算符。解决了这个问题。也缺少一个),但是如果我正确阅读了该代码,则不会触发任何页面更改,而不仅仅是后退按钮。也许这就是我需要调整的地方?
    • 使用上面的代码对解决方案进行了很好的尝试,但是应用程序本身,可能 jQm 并没有一致地使用历史 API。一些标签使用内部页面 #wine_blah" 与 "/wines/reds/",因此必须编写更多处理。我捕获了后退按钮操作:$('div#wine_detail a.ui-btn-left').bind( 'click', function( ){ $.mobile.changePage( "/wines/whites/", { transition: "slide"} );}); 但我得到了一个静默事件,重新加载同一页面并然后最后回到我想要的视图,也不一致。可能我需要在 django 中创建一个视图堆栈...
    • 这引入了一个名为 i 的全局变量;)
    【解决方案2】:

    为什么不在页面的标题部分有一个后退按钮?像这样的:

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

    【讨论】:

      【解决方案3】:

      我最近也为此苦苦挣扎。在考虑之后,我意识到我可以重写我的 JQM 应用程序,以便为那些我不希望出现在我的历史记录中的页面使用弹出“窗口”。与胡乱处理浏览器历史记录相比,这最终是一个更简单、更干净的解决方法。

      现在用户可以直观地使用浏览器的后退按钮,我不必编写应用程序的后退按钮。

      您唯一需要确保的是弹出窗口本身不会进入浏览器历史记录,因此请确保将“历史记录”选项设置为 false,如下所示:

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

      【讨论】:

        【解决方案4】:

        好的,所以解决方案接近我发布的更新。以前的解决方案的问题是有很多东西绑定到“返回”按钮。虽然我的新绑定操作有时可能会起作用,但其他操作也会发生,我尝试了unbind(),但仍然没有工作。

        我的解决方案是有点雾里看花。我检查上一页是否是评论页面,如果是,我将旧的后退按钮换成新的人造按钮,其中包含历史后退步骤,如下所示:

        $('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 来改进,因此用户永远看不到交换。希望这对某人有所帮助。

        【讨论】:

        • 在哪里可以获得有关 $.mobile.urlHistory 的更多信息?
        • 嗨马塞洛,不太清楚你的意思。 $.mobile.urlHistory 返回一个历史对象。
        • 我的意思是任何有关它的文档。
        • 我记得我用这些作为参考:html5demos.com/historydiveintohtml5.info/history.htmlhope 有帮助
        【解决方案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 而不是 ready 或在您的情况下使用 pageshow。我认为这将解决您的问题,而无需解决历史队列。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-31
            • 1970-01-01
            • 2020-05-12
            • 1970-01-01
            • 1970-01-01
            • 2015-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多