Windows 8 Win8 JS应用程序:如何防止向后导航?无法设置WinJS.Navigation.canGoBack

Windows 8 Win8 JS应用程序:如何防止向后导航?无法设置WinJS.Navigation.canGoBack,windows-8,navigation,winjs,appbar,Windows 8,Navigation,Winjs,Appbar,对于开发Windows8来说,我是一个新手,我正在开发一个应用程序,它有一个相当简单的模型。我看了又看,但似乎找不到关于如何设置WinJS页面以防止向后导航的明确答案。我试着深入研究API,但它没有说明任何问题 我尝试使用的代码是 WinJS.Navigation.canGoBack = false; 运气不好,它一直抱怨属性是只读的,但是,没有setter方法来更改它 提前谢谢你, ~SeancanGoBack只在base.js中定义了一个getter,它反映了backbackback的存在

对于开发Windows8来说,我是一个新手,我正在开发一个应用程序,它有一个相当简单的模型。我看了又看,但似乎找不到关于如何设置WinJS页面以防止向后导航的明确答案。我试着深入研究API,但它没有说明任何问题

我尝试使用的代码是

WinJS.Navigation.canGoBack = false;
运气不好,它一直抱怨属性是只读的,但是,没有setter方法来更改它

提前谢谢你, ~Sean

canGoBack只在base.js中定义了一个getter,它反映了backbackback的存在或不存在;即导航、历史、后退

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

可以显式设置backbackback;有一个示例,包括还原历史记录以及防止使用导航,代码如下:

    // 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();
        }
    },

因此,大量的搜索和尝试禁用后退按钮的不同方法,最终找到了一个不错的解决方案。它是根据另一个问题改编的

原始算法:

我的解决方案

在片段页面的开头,就在页面定义开始声明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元素,可能是由于页面的初始化状态

还有其他一些,但我认为一定有更好的方法在页面加载后检索元素。如果有人能启发我,我将不胜感激。
~Sean R.

您不能更改canGoBack,但可以禁用按钮隐藏它并释放历史堆栈

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

这将防止后退,但仍允许前进。

我认为处理此问题的方法是在要禁用后退导航的页面上隐藏后退按钮。@bmceldowney请参阅我的回复帖子以获取评论。我将把这个问题搁置几天,以防你能为我提供更好的解决方案。谢谢,这个答案的有趣之处在于,我把这两个链接都放在了这个项目的专用文件夹中。有没有办法利用beforenavigate功能以迂回的方式禁用Backbackback?不确定为什么这不是正确的答案。很好的表演伙伴。更新到接受的答案。在经历了几年的额外经验后回顾这个问题……正如朱利叶斯·凯撒所说,经验是一切的老师。@bmceldowney如果你有更好的方法,请分享。由于StackOverflow中没有私人消息,请发布答案。谢谢那么键盘导航如何,例如Alt+光标左移?@0xA3尚未尝试。由于backback是空的,我想说什么也没有发生。但我可能错了。如果你在键盘上遇到异常,请向我报告,我将在本周末寻找解决方案。