How to clear or change the navigation history of Jquery Mobile?

后端 未结 4 541
自闭症患者
自闭症患者 2020-12-23 10:39

I have a PhoneGap App using jQuery Mobile. At a certain page, I cannot let the user go back to the last page he visited.

The pages order is like this:



        
相关标签:
4条回答
  • 2020-12-23 11:04

    jQuery Mobile uses the browser history for page to page navigation, so preventing the user from going back is not really possible in a browser. However, since you have a phonegap app, you can handle the back button directly. This question should help you: Override Android Backbutton behavior only works on the first page with PhoneGap

    0 讨论(0)
  • 2020-12-23 11:06

    Just an FYI; in JQM 1.4 rc1 there is no urlHistory, but you can read from navigate object.

    example:

    $.mobile.navigate.history.stack[0];
    // Object {hash: "", url: "http://localhost:61659/"}
    
    $.mobile.navigate.history.stack[1];
    // Object {url: "http://localhost:61659/Search/Filter", hash: "#/Search/Filter", title: "Search Result", transition: "pop", pageUrl: "/Search/Filter"…}
    

    and you can use this utility function to see whats going on:

    $(document).on('pagechange',function() {
        console.log("Current:" + $.mobile.navigate.history.getActive().url);
        console.log("Stack: (active index = " + $.mobile.navigate.history.activeIndex + " -previous index: " + $.mobile.navigate.history.previousIndex + " )");
        $.each($.mobile.navigate.history.stack, function (index, val) {
            console.log(index + "-" + val.url);
        });
    });
    

    see also here

    Deprecated current behaviour of stripping query strings from hashes. Starting in 1.5 we’ll be following spec on hashes and provide a hook to handle custom navigation.

    0 讨论(0)
  • 2020-12-23 11:09

    Basically you have two history "pots" you need to tamper with. Browser and JQM.

    JQM urlHistory
    You can modify JQMs urlHistory very easily. From the JQM code:

    urlHistory = {
        // Array of pages that are visited during a single page load.
        // Each has a url and optional transition, title, and pageUrl
        // (which represents the file path, in cases where URL is obscured, such as dialogs)
        stack: [],
        // maintain an index number for the active page in the stack
        activeIndex: 0,
        // get active
        getActive: function () {
            return urlHistory.stack[urlHistory.activeIndex];
        },
        getPrev: function () {
            return urlHistory.stack[urlHistory.activeIndex - 1];
        },
        getNext: function () {
            return urlHistory.stack[urlHistory.activeIndex + 1];
        },
        // addNew is used whenever a new page is added
        addNew: function (url, transition, title, pageUrl, role) {
            // if there's forward history, wipe it
            if (urlHistory.getNext()) {
                urlHistory.clearForward();
            }
            urlHistory.stack.push({
                url: url,
                transition: transition,
                title: title,
                pageUrl: pageUrl,
                role: role
            });
            urlHistory.activeIndex = urlHistory.stack.length - 1;
        },
        //wipe urls ahead of active index
        clearForward: function () {
            urlHistory.stack = urlHistory.stack.slice(0, urlHistory.activeIndex + 1);
        }
    };
    

    So all of the above functions are available and can be called like this for example:

    $.mobile.urlHistory.clearForward();
    

    To monitor your history, put this somewhere and listen for pageChange (once transitions are done) to see what is inside the urlHistory:

    $(document).on('pagechange', 'div:jqmData(role="page")', function(){
        console.log($.mobile.urlHistory.stack);
    });
    

    From there you can start to see what should be in the history and clean it up as you need.

    I'm using this a lot for my own navigation layer to modify what is stored in the urlHistory and what should not be stored. Sync-ing with the browser is the difficult part...

    On sync-ing with the browser:
    In my navigation layer I'm only removing double entries from the urlHistory, so there is always a page to go to (and not two), when you click the browser back button. In your case, you will presumable have 4 entries in the browser history, but if you remove 2 entries from JQM urlHistory, you will have two pages "not to got to" when the back button is clicked. So if your browser history looks like this:

    www.google.com
    www.somePage.com
    www.YOUR_APP.com = page1
        page2
        page3
        page4
    

    And your remove page2 and page3, clicking back-button should result in:

    1st back-click = page4 > page1
    2nd back-click = page1 > www.somePage.com [because you removed page3]
    3rd back-click = www.somePage.com > www.google.com [because you removed page2]
    

    A theoretical workaround would be:

    1. keep a counter how "deep" you go into a page
    2. remove pages from JQM urlHistory and get a "jump" value = counter-removedPages
    3. on next browser back click, do jump x window.history(back) and only let one JQM transition pass. You url will unwind page4>page3>page2>page1 in one step and you only allow JQM to do a single transition from page4 to page1
    4. check what's in the urlHistory and clean up after your "triple back"

    Beware this is not an optimal solution and you have to consider a lot of things (user clicks somewhere else before going back etc). I tried forever to get something like this to work in a more complicated setup and eventually just stopped using it, because it never worked as it should. But for a simpler setup it may very well work.

    0 讨论(0)
  • 2020-12-23 11:14

    This is a simple answer and so should be taken as such. You may delete items out of the urlHistory.stack simply with

    delete $.mobile.urlHistory.stack[index_of_your_choosing];
    

    If you want to make sure the correct page is deleted you may do something like this.

    var stack_count = $.mobile.urlHistory.stack.length;
    
    for(x=0; x<stack_count; x++){
    
      $.mobile.urlHistory.stack[x];
    
      if(typeof $.mobile.urlHistory.stack[x] !== 'undefined'){
    
        if($.mobile.urlHistory.stack[x].url != 'http://url-to-exclude.com/'){
    
           delete $.mobile.urlHistory.stack[x];
    
        }}
    }
    
    0 讨论(0)
提交回复
热议问题