Win10系列:JavaScript综合实例2
Posted 冯瑞涛(2009年已经停止更新)请加微信:iterryfen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win10系列:JavaScript综合实例2相关的知识,希望对你有一定的参考价值。
在项目中添加一个名为pages的文件夹,并在pages文件夹里面再添加一个名为mainPage的文件夹,接着在mainPage文件夹里添加一个"页面控制"项,命名为mainPage,添加完成之后会同时生成mainPage.html、mainPage.css和mainPage.js这三个文件。
这里将mainPage.html作为应用程序的主页面,打开mainPage.html文件,在body元素中添加一个div元素,并在元素内部添加一个h1元素和一个ListView控件,其中h1元素用于显示页面的标题,ListView控件用于按类别显示菜肴。然后再在body元素中添加两个Template控件,分别用于格式化显示类别名称和菜肴。在用于显示类别名称的Template控件中放置一个p元素,并在p元素内部指定onclick事件由函数WinJS.Navigation.navigate处理。这样当单击某个类别的名称时,就会导航到相应的分类页面。在用于格式化显示菜肴的Template控件中添加一个用来显示菜肴图片的img控件和一个用来显示菜肴名称的h3元素,相关代码如下所示:
<body>
<div class="fragment mainPage">
<header aria-label="Header content" role="banner">
<h1 class="titlearea win-type-ellipsis">
<!--定义页面标题-->
<span class="pagetitle">菜谱</span>
</h1>
</header>
<!--定义ListView控件-->
<div class="groupeditemslist" aria-label="List of groups" data-win-control="WinJS.UI.ListView" data-win-options="{selectionMode: \'multi\'}"></div>
</div>
<!--用于显示类别名称的模板-->
<div class="headerTemplate" data-win-control="WinJS.Binding.Template">
<p class="group-title win-type-x-large" data-win-bind="textContent: title; groupKey: key" onclick="WinJS.Navigation.navigate(\'/pages/classDetail/classDetail.html\', { groupKey: event.srcElement.groupKey })"></p>
</div>
<!--用于显示菜肴的模板-->
<div class="multisizebaseitemtemplate" data-win-control="WinJS.Binding.Template">
<img class="item-image" src="#" data-win-bind="src: backgroundImage; alt: title" />
<div class="item-overlay">
<h3 class="item-title" data-win-bind="textContent: title"></h3>
</div>
</div>
</body>
为了控制应用程序整体的外观,在default.css文件中定义一些页面样式,相关代码如下所示:
/*页面的基本样式*/
#contenthost {
height: 100%;
width: 100%;
}
/* 定义包含header和section的布局*/
.fragment {
-ms-grid-columns: 1fr;
-ms-grid-rows: 128px 1fr;
display: -ms-grid;
height: 100%;
width: 100%;
}
/*设置页面头部的布局*/
.fragment header[role=banner] {
-ms-grid-columns: 120px 1fr;
-ms-grid-rows: 1fr;
display: -ms-grid;
}
/* 进一步设置后退按钮的样式*/
.fragment header[role=banner] .win-backbutton {
margin-left: 39px;
margin-top: 59px;
}
.fragment header[role=banner] .titlearea {
-ms-grid-column: 2;
margin-top: 37px;
}
/* 进一步设置页面标题的样式*/
.fragment header[role=banner] .titlearea .pagetitle {
width: calc(100% - 20px);
}
/*设置页面中section元素的样式*/
.fragment section[role=main] {
-ms-grid-row: 2;
height: 100%;
width: 100%;
}
.mainPage .groupeditemslist .win-horizontal.win-viewport .win-surface {
.mainPage .groupeditemslist .win-groupheader {
.mainPage .groupeditemslist .win-groupheader .group-title {
.mainPage .groupeditemslist .item-image {
.mainPage .groupeditemslist .item-overlay {
.mainPage .groupeditemslist .item-overlay .item-title {
color: rgba(255,255,255,0.87);
ready: function (element, options) {
var listView = element.querySelector(".groupeditemslist").winControl;
listView.groupDataSource = menuData.groups.dataSource;
listView.itemDataSource = menuData.items.dataSource;
listView.groupHeaderTemplate = element.querySelector(".headerTemplate");
listView.itemTemplate = multisizeItemTemplateRenderer;
listView.layout = new WinJS.UI.GridLayout({ groupInfo: SetGroupStyle, groupHeaderPosition: "top" });
listView.oniteminvoked = this.ItemInMainPage_Click.bind(this);
接着在ready函数后面定义处理函数ItemInMainPage_Click,相关代码如下所示:
ItemInMainPage_Click: function (args) {
var item = menuData.items.getAt(args.detail.itemIndex);
接下来在WinJS.UI.Pages.define函数后面定义一个SetGroupStyle函数用来设置列表项的大小,相关代码如下所示:
function multisizeItemTemplateRenderer(itemPromise) {
return itemPromise.then(function (currentItem) {
content = document.querySelector(".multisizebaseitemtemplate");
var result = content.cloneNode(true);
switch (currentItem.groupKey) {
result.className = "horizontaltemplate"
result.className = "largeitemtemplate"
result.className = "squaretemplate"
result.className = "verticaltemplate"
result.className = "squaretemplate"
result.className = "defaulttemplate"
//为了使自定义的样式能够起作用,需要对id为"multisizebaseitemtemplate"的div元素删除一些属性
result.attributes.removeNamedItem("style");
result.getElementsByClassName("item-image")[0].src = currentItem.data.backgroundImage;
result.getElementsByClassName("item-title")[0].textContent = currentItem.data.title;
为了在程序开始运行时默认显示主页面的内容,需要使用之前介绍过的页内导航技术。在js文件夹里添加navigator.js文件,navigator.js文件可以通过新建一个javascript的Windows应用商店的导航布局应用程序项目来获取,然后在default.html文件中声明一个PageControlNavigator导航控件,并设置整个程序的背景图片和透明度,接着将home属性设置成mainPage.html文件的地址,相关代码如下所示:
然后在default.js文件的WinJS.UI.processAll函数后面添加如下代码,用于设置应用程序激活后显示的页面,相关代码如下所示:
args.setPromise(WinJS.UI.processAll());
if (WinJS.Navigation.location) {
WinJS.Navigation.history.current.initialPlaceholder = true;
return WinJS.Navigation.navigate(WinJS.Navigation.location, WinJS.Navigation.state);
return WinJS.Navigation.navigate(Application.navigator.home);
上面代码通过if语句判断WinJS.Navigation.location属性值是否为空,如果属性值不为空,保存location属性的值为页面历史记录并设置initialPlaceholder属性为true,然后导航到location属性值所指向的页面;如果属性值为空,导航到home属性值指向的页面。
最后,在default.html文件的head元素内添加对menuData.js和navigator.js文件的引用,相关代码如下所示:
<script src="/js/navigator.js"></script>
<script src="/js/menuData.js"></script>
启动调试,会看到所有的菜肴和主食按类别显示在了主页面中,由于篇幅有限,这里只截取了"蔬菜类"和"肉类"的显示效果,如图19-34所示。
以上是关于Win10系列:JavaScript综合实例2的主要内容,如果未能解决你的问题,请参考以下文章