对于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 .