Win8 JS App:如何防止后向导航?无法设置WinJS.Navigation.canGoBack

时间:2013-03-25 22:52:06

标签: windows-8 navigation winjs appbar

对于Windows 8的开发相当新,我正在开发一款具有相当扁平模型的应用程序。我看了看,但似乎无法找到如何设置WinJS页面以防止向后导航的明确答案。我已经尝试深入研究API,但它没有就此事发表任何意见。

我试图使用的代码是

WinJS.Navigation.canGoBack = false;

没有运气,它一直在抱怨只读取属性,但是,没有可以改变它的setter方法。

提前谢谢, 〜肖恩

3 个答案:

答案 0 :(得分:7)

canGoBack只有一个getter(在base.js中定义),它反映了backstack的缺失或存在;即nav.history.backstack

按钮本身的外观由相关按钮DOM对象上的disabled属性控制,该对象又是控制可见性的CSS选择器的一部分。因此,如果您修改后退按钮的显示,请注意导航管道也是如此。

可以明确设置backstack; Navigation and Navigation History Sample有一个示例,其中包括使用beforenavigate恢复历史记录以及阻止导航,并使用以下代码:

    // in ready
    WinJS.Navigation.addEventListener("beforenavigate", this.beforenavigate);


    //
    beforenavigate: function (eventObject) {
        // This function gives you a chance to veto navigation. This demonstrates that capability
        if (this.shouldPreventNavigation) {
            WinJS.log && WinJS.log("Navigation to " + eventObject.detail.location + " was prevented", "sample", "status");
            eventObject.preventDefault();
        }
    },

答案 1 :(得分:3)

您无法更改canGoBack,但您可以禁用该按钮以隐藏它并释放历史堆栈。

    // disabling and hiding backbutton
    document.querySelector(".win-backbutton").disabled = true;
    // freeing navigation stack
    WinJS.Navigation.history.backStack = [];

这样可以防止倒退,仍然可以继续前进。

答案 2 :(得分:0)

所以大量的搜索和尝试禁用后退按钮的不同方法,终于找到了一个不错的解决方案。它已经从另一个stackoverflow问题改编而来。

原始算法:How to Get Element By Class in JavaScript?


我的解决方案

在片段页面的开头,正如页面定义开始声明ready:函数一样,我使用了上述算法的改编版本,并使用结果元素选择来设置disabled属性。

        // Retrieve Generated Back Button
        var elems = document.getElementsByTagName('*'), i;

        for (i in elems)
        {
            if((" "+elems[i].className+" ").indexOf("win-backbutton") > -1)
            {
                var d = elems[i];
            }
        }

        // Disable the back button
        d.setAttribute("disabled", "disabled");

代码从页面的DOM中获取所有元素,并为生成的后退按钮过滤它。找到合适的元素后,将其分配给变量,然后我们可以设置disabled属性。


我找不到很多关于在WinJS导航应用中使用默认导航的文档,所以这里有一些失败的方法(供参考):

  • 按类获取元素并设置|可能因为做错了而失败了,因为我对HTML和javascript没什么经验。

  • 使用上述方法,但在for循环中设置属性会破坏应用程序并导致其冻结,原因不明。

  • 在导航完成之前在default.js中设置属性。 | javascript调用无法识别被调用的方法或DOM元素,可能是由于页面的初始化状态。

还有其他几个,但我认为在页面加载后必须有更好的方法来检索元素。如果有人能够启发我,我将非常感激。 〜肖恩R。