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.css文件中定义主页面的样式和ListView控件中元素的样式,包括大元素、小元素、长元素和宽元素形式,相关代码如下所示:
.mainPage{
-ms-grid-rows: 1fr;
display: -ms-grid;
height: 100%;
width: 100%;
}
.mainPage .groupeditemslist .win-horizontal.win-viewport .win-surface {
/*整个布局*/
margin-left: 45px;
margin-top: 133px;
margin-bottom: 120px;
}
/*设置listview控件的样式*/
.mainPage .groupeditemslist {
height: 100%;
position: relative;
width: 100%;
z-index: 0;
}
.mainPage .groupeditemslist .win-groupheader {
margin-top: 5px;
margin-left: 70px;
padding: 0;
}
.mainPage .groupeditemslist .win-groupheader .group-title {
margin-bottom: 10px;
margin-left: 5px;
}
/*每个在listview显示的菜肴的样式*/
.mainPage .groupeditemslist .item-image {
-ms-grid-row-span: 2;
}
.mainPage .groupeditemslist .item-overlay {
-ms-grid-row:2;
-ms-grid-rows: 1fr 21px;
display: -ms-grid;
padding: 16px 10px 2px 15px;
background: rgba(0,0,0,0.30);
}
.mainPage .groupeditemslist .item-overlay .item-title {
-ms-grid-row:1;
overflow: hidden;
width: 220px;
color: rgba(255,255,255,0.87);
}
/*定义默认样式*/
.defaulttemplate
{
width: 150px;
height: 150px;
overflow: hidden;
-ms-grid-columns: 1fr;
-ms-grid-rows: 0px 1fr;
display: -ms-grid;
}
/*定义小元素样式*/
.squaretemplate
{
width: 150px;
height: 150px;
-ms-grid-columns: 1fr;
-ms-grid-rows: 1fr 60px;
display: -ms-grid;
overflow: hidden;
}
/*定义长元素样式*/
.verticaltemplate
{
width: 150px;
height: 470px;
-ms-grid-columns: 1fr;
-ms-grid-rows: 1fr 90px;
display: -ms-grid;
overflow: hidden;
}
/*定义宽元素样式*/
.horizontaltemplate
{
width: 310px;
height: 150px;
-ms-grid-columns: 1fr;
-ms-grid-rows: 1fr 60px;
display: -ms-grid;
overflow: hidden;
}
/*定义大元素样式*/
.largeitemtemplate
{
width: 310px;
height: 310px;
overflow: hidden;
-ms-grid-columns: 1fr;
-ms-grid-rows: 1fr 80px;
display: -ms-grid;
overflow: hidden;
}
定义了前台页面样式之后,打开mainPage.js文件,在ready函数内添加功能代码,实现将ListView控件与数据源相绑定,以便能够显示菜谱数据,并引用模板来控制数据的显示格式,相关代码如下所示:
ready: function (element, options) {
//获取页面中的ListView控件
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控件设置布局
listView.layout = new WinJS.UI.GridLayout({ groupInfo: SetGroupStyle, groupHeaderPosition: "top" });
//给oniteminvoked事件设置处理函数
listView.oniteminvoked = this.ItemInMainPage_Click.bind(this);
}
在上面代码中,在ready函数里调用element.querySelector函数获取class属性为"groupeditemslist"的ListView控件并赋值给listView变量。然后将menuData命名空间里的groups和items两个数据源分别赋值给listView的groupDataSource和itemDataSource属性,调用element.querySelector函数获取class属性为"headerTemplate"的Template控件并赋值给listView的groupHeaderTemplate属性,然后设置listView的itemTemplate属性值为multisizeItemTemplateRenderer,并通过listView的layout属性设置ListView控件的布局。最后为listView的oniteminvoked事件注册事件处理函数ItemInMainPage_Click。
接着在ready函数后面定义处理函数ItemInMainPage_Click,相关代码如下所示:
ItemInMainPage_Click: function (args) {
//从分组列表中获取到这项菜肴
var item = menuData.items.getAt(args.detail.itemIndex);
//然后根据菜肴的标识导航到相应的页面
WinJS.Navigation.navigate("/pages/foodDetail/foodDetail.html", { item: menuData.getItemReference(item) });
}
在ItemInMainPage_Click处理函数内先调用menuData命名空间中items对象的getAt函数来获取菜肴的索引并赋值给变量item,然后调用WinJS.Navigation.navigate函数根据菜肴的索引和标识导航到相应的菜肴详细信息页面。
接下来在WinJS.UI.Pages.define函数后面定义一个SetGroupStyle函数用来设置列表项的大小,相关代码如下所示:
function SetGroupStyle() {
return {
enableCellSpanning: true,
cellWidth: 150,
cellHeight: 150
};
}
前面在WinJS.UI.Pages.define函数中用到了multisizeItemTemplateRenderer函数来设置listView对象的itemTemplate属性,接下来在SetGroupStyle函数后面定义multisizeItemTemplateRenderer函数,相关代码如下所示:
function multisizeItemTemplateRenderer(itemPromise) {
return itemPromise.then(function (currentItem) {
var content;
//通过class值获取相应的div元素
content = document.querySelector(".multisizebaseitemtemplate");
var result = content.cloneNode(true);
//不同类别中的菜肴使用不同的样式
switch (currentItem.groupKey) {
case "shucai":
{
//蔬菜类的菜肴采用宽元素形式显示
result.className = "horizontaltemplate"
break;
}
case "roulei":
{
if (currentItem.index == 3) {
// ListView中的第四个元素采用大元素形式
result.className = "largeitemtemplate"
}
else {
//肉类中的其他菜肴采用小元素形式
result.className = "squaretemplate"
}
break;
}
case "yulei":
{
//鱼类中的菜肴采用长元素形式
result.className = "verticaltemplate"
break;
}
case "zhushi":
{
//主食类也采用小元素形式
result.className = "squaretemplate"
break;
}
default:
{
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;
return result;
});
}
函数中定义了一个匿名函数,在这个匿名函数中,首先调用document.querySelector函数获取class属性为"multisizebaseitemtemplate"的Template控件并赋值给content变量。然后调用content的cloneNode方法来复制一个模板副本,在此模版副本的基础上自定义模板样式并赋值给result变量。接着使用switch语句根据currentItem.groupKey的不同值来选择不同的元素样式。当currentItem.groupKey值为"shucai"时,把result对象的className属性值设置为horizontaltemplate,即第一分类的所有元素设置为之前定义的名为"horizontaltemplate"的样式;当currentItem.groupKey值为"roulei"时,使用了if语句来使第二分类中的元素显示不同风格样式,当"currentItem.index == 3"时,所有元素的第四个元素会被设置为之前定义的名为"largeitemtemplate"的样式,其余的第二分类元素会设置为之前定义的名为"squaretemplate"的样式。剩余分类的样式设置方法和第一分类相同,这里就不再逐一介绍了。由于result是复制出来的,因此为了使自定义的样式能够起作用,需要调用result的attributes.removeNamedItem函数移除style属性,并通过getElementsByClassName函数分别获取class属性值为"item-image"和"item-title"的img元素和h3元素,分别设置这两个元素的数据源,最后返回result对象。
为了在程序开始运行时默认显示主页面的内容,需要使用之前介绍过的页内导航技术。在js文件夹里添加navigator.js文件,navigator.js文件可以通过新建一个JavaScript的Windows应用商店的导航布局应用程序项目来获取,然后在default.html文件中声明一个PageControlNavigator导航控件,并设置整个程序的背景图片和透明度,接着将home属性设置成mainPage.html文件的地址,相关代码如下所示:
<body>
<div id="contenthost" style="background: url(/images/beijing.jpg); background-repeat: round; opacity: 0.80;" data-win-control="Application.PageControlNavigator" data-win-options="{home: '/pages/mainPage/mainPage.html'}"></div>
</body>
然后在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);
} else {
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所示。

图19-34 主页面的效果图
Win10系列:JavaScript综合实例2的更多相关文章
- Win10系列:JavaScript综合实例1
上面几个小节讲解了使用HTML5和JavaScript语言开发Windows 应用商店应用时会用到的一些技术,本小节将前面介绍的知识融合在一起创建一个菜谱应用程序,帮助读者更进一步地理解和掌握这些知识 ...
- Win10系列:JavaScript综合实例4
实现主页面和分类页面的之后,最后来看一下菜肴页面的实现,这个页面用于详细介绍某项菜肴或主食,如名称.图片和具体做法等.在pages文件夹里面添加一个名为foodDetail的文件夹,并在foodDet ...
- Win10系列:JavaScript综合实例3
实现主页面的功能之后,接下来实现分类页面.分类页面中显示一种菜肴类别的详细信息,包括类别名称.图片.描述信息以及属于该类别的一些菜肴.在pages文件夹中添加一个名为classDetail的文件夹,并 ...
- 一步一步学Silverlight 2系列(18):综合实例之RSS阅读器
一步一步学Silverlight 2系列(18):综合实例之RSS阅读器 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支 ...
- html5--5-16 综合实例绘制饼图
html5--5-16 综合实例绘制饼图 实例 <!doctype html> <html> <head> <meta charset="utf-8 ...
- Qt Quick综合实例之文件查看器
假设你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以Applicat ...
- ReportingServies——SQLServer报表开发综合实例
如果我们安装了sqlserver2008 R2,将会自动安装一个报表开发工具 不要以为此报表开发工具只适合于sqlserver2008,其实在sqlserver2012中也是支持的,事实上我现在项目中 ...
- Loadrunner 关联 web_custom_request综合实例
Loadrunner 关联 web_custom_request综合实例 Loadrunner 关联web_custom_request,针对自带的订票系统的一个综合实例,相信看了本文大家对学习loa ...
- 使用VS2012 开发SharePoint 2013 声明式的action(activity) 综合实例
本文讲述使用VS2012 开发SharePoint 2013 声明式的action 综合实例. 需求同: http://blog.csdn.net/abrahamcheng/article/detai ...
随机推荐
- rm
rm [选项]... 目录... 删除指定的<文件>(即解除链接). -d --directory 删除可能仍有数据的目录 (只限超级用户)-f --force ...
- 04-python-闭包
1.闭包的概念: 官方概念:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创 ...
- Visual Studio 2015+InstallShield 2015
下载Installshield http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visua ...
- idataway_前端代码规范
1.前后端json对接的规范. 前后端的json代码规范 result ={ success:”true”,//true表示成功,false表示失败. data:{}, //数据 errorCode: ...
- qrcode render 二维码扫描读取
著名的 qrcode 是 zxing https://github.com/zxing/zxing 基于 java, java 真的是轮子多啊... zxing 的 javascript 版本是 ht ...
- Python全栈开发-Day4-Python基础4
本节内容 匿名函数 装饰器 列表生成式.迭代器&生成器 内置函数 Json & pickle 数据序列化 1. 匿名函数 匿名函数就是不需要显式的指定函数 1 2 3 4 5 6 7 ...
- (转)C# 的三种序列化方法
序列化是将一个对象转换成字节流以达到将其长期保存在内存.数据库或文件中的处理过程.它的主要目的是保存对象的状态以便以后需要的时候使用.与其相反的过程叫做反序列化. 序列化一个对象 为了序列化一个对象, ...
- 远程服务器返回了意外相应:(413) Request Entity Too Large。
在从客户端向WCF服务端传送较大数据(>65535B)的时候,发现程序直接从Reference的BeginInvoke跳到EndInvoke,没有进入服务端的Service实际逻辑中,怀疑是由于 ...
- 8.2 DRAM和SRAM
计算机组成 8 存储层次结构 8.2 DRAM和SRAM SRAM比较快,DRAM比较慢:SRAM比较贵,DRAM比较便宜.记住这些结论是很容易的,但是比是什么更重要的是为什么.那在这一节我们就从电路 ...
- apiCloud 三方分享,微信好友分享,微信朋友圈分享,QQ分享,微博分享
首先查看我的这篇有关三方登录的博客,地址是http://www.cnblogs.com/gqx-html/p/8303567.html,配置完三方数据后可以从上一篇文章中的链接跳转到各个登录查看api ...