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



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

我尝试使用的代码是

WinJS.Navigation.canGoBack = false;

没有运气,它一直抱怨属性是只读的,然而,没有setter方法来改变它。

提前感谢,~肖恩

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

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

可以显式设置backstack;有一个示例导航和导航历史示例,其中包括恢复历史以及使用beforenavigation防止导航,代码如下:

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

你不能改变canGoBack,但是你可以禁用按钮来隐藏它并释放历史堆栈。

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

所以很多搜索和尝试不同的方法禁用后退按钮,终于找到了一个体面的解决方案。它改编自另一个stackoverflow问题。

原始算法:如何在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 .

最新更新