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%;

}

/* 定义包含headersection的布局*/

.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综合实例1

上面几个小节讲解了使用HTML5和JavaScript语言开发Windows应用商店应用时会用到的一些技术,本小节将前面介绍的知识融合在一起创建一个菜谱应用程序,帮助读者更进一步地理解和掌握这些知识。此菜谱应用程序主要的功能是介... 查看详情

win10系列:javascript动画2

"重新定位"动画也是Windows动画库中的动画效果。"重新定位"动画的动画效果是指一个或一组元素移动到新的位置时,这些元素不是突然出现在新的位置,而是从一个位置移动到另一个位置。创建"重新定位"动画可以使用WinJS.UI.Anima... 查看详情

win10系列:javascript页内导航

...在一个页面内根据需要加载其他页面的内容,在开发基于JavaScript的Windows应用商店应用时,可以使用WinJS.Navigation.navigate函数传递要加载的页面地址并使用PageControlNavigator控件加载其他页面的内容。WinJS.Navigation.navigate函数以一个包... 查看详情

win10系列:javascript图形

...canvas元素会在页面上生成一个矩形的位图画布,可以使用JavaScript在画布上实时绘制图形图像。在绘制图形时,需要先调用画布的getContext函数获取与该画布相关的用于绘制图形(如2D图形、3D图形)的对象,然后使用这个对象调用... 查看详情

win10系列:javascript动画4

上面介绍的动画效果是通过Windows动画库创建的,这里的旋转动画是通过设置页面元素的style对象的相关属性来创建,此动画的效果是将界面元素沿着指定的方向进行旋转。下面介绍style对象的几个常用属性。transitionProperty:获取... 查看详情

win10系列:javascript模板绑定

WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式。定义一个WinJS库模板的方法与定义WinJS库控件的方法相似:在页面中添加一个div元素,将di... 查看详情

win10系列:javascript写入和读取文件

正如上面的内容中所提到的,文件保存选取器用于保存文件,通过Windows.Storage.Pickers命名空间中的FileSavePicker类的pickSaveFileAsync函数可以向指定的文件系统位置中保存一个文件。文件保存之后,还可以对其进行读写操作,如果是向... 查看详情

win10系列:javascript控件的使用

...的基本控件,如按钮和复选框;WinJS库控件是为开发基于JavaScript的Windows应用商店应用提供的新控件,如ListView、HtmlControl和PageControl等。下面首先介绍如何添加这两种类型的控件,然后介绍如何为控件注册事件处理函数和设计控... 查看详情

win10系列:javascript动画3

"交叉进出"动画也是Windows动画库中的动画效果。"交叉进出"动画的动画效果是在应用程序界面上隐藏一个元素并同时在相同位置显示另一个元素的时候,被隐藏的元素渐消失在应用程序界面上,而将要显示的元素渐显示在应用程... 查看详情

win10系列:javascript页面导航

页面导航是在开发应用的过程中使用频率较高的技术,其中比较常用的导航方式有多页导航和页内导航,采用多页导航方式的应用程序包含一系列的页面,在一个页面中加入另一个页面的链接地址后,单击链接将跳转到指定页面... 查看详情

win10系列:javascript动画1

在应用程序中使用动画会使应用显得更加生动,进而给用户带来良好的视觉效果。例如,当用户将某个项添加到列表时,新项不会立即出现在列表中,而是采用动画形式到达相应位置,并且列表中的其他项也采用动画形式移动到... 查看详情

win10系列:javascript数据绑定

使用数据绑定可以使页面中元素的属性值与数据源中的数据同步,其中数据源可以来自数据库、文件以及自定义的数据等。在常用的数据绑定方法中,简单对象绑定是将HTML元素与一个仅包含数据的简单对象相绑定,模板绑定是... 查看详情

win10系列:javascript多媒体

在应用程序的日常使用中,经常会使用多媒体播放器来播放多媒体文件,包括视频、音频等,因此对于开发者来说,学习多媒体播放技术对开发应用是很有帮助的。本小节主要介绍如何使用HTML5和JavaScrip实现播放本地视频。想要... 查看详情

win10系列:javascript获取文件和文件夹列表

在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作。如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolders类的相应属性来实现,可用属性包括doc... 查看详情

win10系列:javascript访问文件和文件夹

...门基于C#语言的详细讲解,本节主要介绍如何使用HTML5和JavaScript开发具有文件操作功能的Windows应用商店应用,首先来了解一下用于对文件或文件夹进行操作的文件选取器。19.4.1文件选取器正如前面章节C#语言中所介绍的,文件选... 查看详情

日常系列leetcode《13·综合应用1篇》(代码片段)

数据规模->时间复杂度<=10^4😮(n^2)<=10^7:o(nlogn)<=10^8:o(n)10^8<=:o(logn),o(1)综合<直接模拟、经典查找>lc1【top100】:两数之和https://leetcode.cn/problems/two-sum/提示:2< 查看详情

如何编写脚本从快捷方式运行 2 个 CMD 实例和(Win 10)中的 2 个 python 程序?

】如何编写脚本从快捷方式运行2个CMD实例和(Win10)中的2个python程序?【英文标题】:Howtowriteascripttorun2instancesofCMDfromshortcutand2pythonprogramswithin(Win10)?【发布时间】:2021-05-1911:27:23【问题描述】:我正在为Windows10编写一个简单的.b... 查看详情

综合条目整理

目录说明科学ADVenture系列美妙Pretty☆系列物语系列机动战士高达系列TYPE-MOON系列とある系列灰色系列新海诚作品说明综合条目只记录各作的主条目,具体各作包含哪些TV,OVA,OAD,剧场版,动画电影等请进入主条目查阅。可以按... 查看详情