返回首页

大纲{A}概述
本文介绍我的经验写在Silverlight为Windows Phone 7控制和重新实现它使用JavaScript和HTML5的跨平台。我在写这篇文章的目的不是要比较的HTML5 / CSS3 / JavaScript和Silverlight的功能特性,如果你眯着眼睛有点,你可以映射从一个最具特色。相反,我想捕捉方法和一般"的感觉的区别??与这两种截然不同的技术的发展。
,你可以看到在这里iPod Touch的行动完成HTML5的控制:你也可以看到它在运行。介绍(和Windows 8)
我写了我原来的。有趣的是,虽然有一些技术可能被用于跨平台的Web应用程序开发,为移动,,但只是其中的一个,HTML5的。幸运的是,移动浏览器未来的桌面采用HTML5的,这就是为什么我决定这将是一个有趣的练习,才能有它运行在iPhone,Android的,我曾写信给HTML5的一些Windows Phone 7的代码移植,并黑莓手机。
最近的新闻,关于Windows 8的发布引起了很大{A20}我认为当前的形势提供了一个务实和测量总结。
除了最近发生的事件,它是明确的,背后HTML5的势头越来越大。我认为这是一个明智之举任何开发尝试他们的手,在发展"的JavaScript方式??{A21} Silverlight的跳转表控制
的Windows Phone 7跳转表解决了一个有趣的问题,面临着移动应用的开发。虽然在桌面上,可用于精确的鼠标移动抢,拖动滚动条,导航信息的大名单。移动的用户界面通常放弃可见的滚动,轻扫手势取代,从而节省了宝贵的屏幕空间。不过,如果你正面临着​​一长串的信息,刷卡多次到达列表的底部附近的位置变得相当苦差事!
英寸跳转表列表中的数据进行分类排列,每一个"跳"按钮??在顶部。点击跳转按钮,显示了一个类,在这里您可以按一下"跳??列表到所需的位置。按日期或字母顺序排列的数据,这工作得很好。
下面的屏幕截图显示了控制,我在行动:
{S0}
您可以阅读有关的发展,这在我以前CodeProject上文章中的控制所有。{A22}一个JavaScript进修
我已经没有很大的JavaScript经验,所以才开始这方面的发展,我想我应该打的书籍。一些同事的Douglas Crockford的"JavaScript的:好的部分复制??所以,不希望了解不好的事情,我认为这是一个良好的开端。

"好的部分??是一个有趣的阅读。笔者采用JavaScript语言的令人耳目一新的诚实。它始终是一件有趣的比较"权威指南"这本书的侧端的大小??这可能不是一个准确的JavaScript究竟如何是"好反映吗??然而,它让你觉得 - 究竟这是什么样的语言,它需要一本书,精心指导,从"坏零件你走??你肯定不会发现类似的"好的部分??为Java,C#或任何其他的主流编程语言的书籍。
在熟悉面向对象的构造缺乏,缺乏块的范围,一个"这个呢???关键字,有一个非常{A23}给定的语言,特别是通过C谁已来为JavaScript开发一个坏名声,#或Java的。
的JavaScript语言的宽容性质意味着,你可以使事情工作相当马虎代码。然而,为增加对HTML5的普及,我们发现自己建设越来越复杂的应用程序使用JavaScript语言,一个更深的理解的语言变得更加重要。并为此目的,"好的部分??是一个有益的指导。{A24}入门
武装"好的部分??我开始思考的JavaScript继承模式,我将使用创建跳转表的控制; {A25}?然后我的头开始疼了,我开始思考整个构思困扰两次!直到我意识到,不像的WinForms,Silverlight和WPF的Swing(Java)的,和几乎所有其他的UI框架,,你不必从现有类继承以创建一个控件。
这使我考虑Silverlight和HTML / JavaScript的根本区别。使用Silverlight的UI(用户界面)是定义在XAML,XML文件,然后分析,以创建内存中的表示的UI(可视化树)。必须继承自DependencyObject的一个共同的基类,在树中的所有元素。基本上,XAML是比创建一个对象图的一个方便的语法。另一方面,HTML是不创建JavaScript对象,远离它的语法! HTML描述了一个页面,这是由浏览器解析,以创建一个文档对象模型(DOM)的结构。浏览器公开的API操纵这些DOM使用JavaScript语言。两相当"松耦合??,每个人都可以存在(而且经常)没有其他。鉴于XAML是"紧耦合??与Silverlight框架,其唯一的目的是创建框架中包含的类的实例。
HTML和JavaScript的独立性,我摆脱棘手的决定,有关继承模式,你可以简单地创建您的标记和操纵它。我还发现,这种独立性当您尝试执行更复杂的互动,但在此之后更多的优势... ...
JavaScript开发人员很少直接对由DOM公开的API程序,而不是有利于抽象API的使用。其次,有几个原因抽象A​​PI,JavaScript开发意识,首先,DOM API的各种浏览器外露不同,抽象API往往比DOM的API,它们抽象提供更强大的功能。
有不少抽象API可供选择,因此,而不是审查每个反过来,我决定选择最流行的一种,{A26}。{A27}渲染一个简单的列表
时间停止担心以正确的方式做的事情,并写一些代码!
我的测试页有以下简单的标记:

<html>

<head>

    <script type="text/javascript" src="jquery-1.6.1.js"></script>

    <script type="text/javascript" src="jumpList.js"></script>    

    <link rel="stylesheet" type="text/css" href="jumpList.css" />

</head>

<body>

    <div class="jumpList" style="width:200px; height:300px"/>

</body>

</html>

类跳转表的div的DOM元素,在这里我想创造我的控制。
顺便说一下,我做了错误的自闭的脚本标记元素,即,LT;脚本/ GT,其中{A28}。我浪费了相当多的时间,恼人的小新手错误!
我第一次切跳转表的JavaScript代码创建了一个人对象的数组(使用{A29}我发现一些代码在互联网上),这是按姓氏排序。然后,该代码遍历这个数组,添加一个新的李在父类ITEMLIST UL每个元素。{C}
看到这个代码创建的结构,最好的办法是通过浏览器如Firefox的Firebug的或内置的浏览器开发工具的开发工具:
{S2}
以上的JavaScript代码的大部分是按照C#开发人员可能比较容易,但是美元的函数$()可能是不值一提。 jQuery的定义一个全局函数的名字??????这是用来创建一个jQuery对象,通过提供一个CSS选择器或HTML片段,。 jQuery是众所周知其流畅的界面,它允许你连锁函数调用:
$("div.test").add("p.quote").addClass("blue").slideDown("slow");

这流利的风格,熟悉C#开发人员使用LINQ语法(扩展方法)。然而,方式是完全不同的两个工作的。良好的C#LINQ的API依靠IEnumerable接口的定义,其中每个方法返回一个IEnumerable的扩展方法。使用jQuery,jQuery对象(这是由美元的函数返回的对象)包装DOM节点的集合,每个功能操作这些节点,并返回一个jQuery对象。
一个全球性的功能??????的使用,使jQuery的相当简洁。然而,其他库就可以了,这样做,定义此相同的全局函数。例如,微软的ASP.NET AJAX库提供一元函数,作为一个由ID获取一个DOM元素的简写。幸运的是,jQuery有一个{A30}省略了全球美元功能。
在上面的代码,我有前缀,与美元的jQuery对象的所有变量。这是一种流行的公约,但没有执行本身的效果。
到目前为止,上面的代码创建一个嵌套的UL其中包含的元素的列表。我复制的Windows Phone 7控制允许您滚动一长串的数据,因此嵌套UL需要裁剪到其母公司的高度,让您滚动其内容。 CSS溢出属性使这个功能:
.itemList

{

    overflow-y: auto;

}

ul和li元素也自称删除子弹点,并应用标准,这些元素的填充:
ul.itemList

{

    padding: 0;

}



ul.itemlist li

{

    list-style-type: none;

}

对于这个工作,ITEMLIST格需要有相同的高度作为其母公司。不幸的是,这是仅使用CSS不是那么容易取得。 Silverlight的跳转表控制项目清单和分类列表中的份额的内容相同的面积,以便使用网格布局。然而,有没有这样相当于直接在HTML。为什么有这么多的黑客攻击方法创造经典的网页布局,如三列和页脚布局(这是为什么我仍然很高兴地使用表!),缺乏体面的网格支持。未来的CSS像{A31}的一些功能看起来非常有前途,但也似乎已经练到即使是在浏览器中的初步实施阶段。
目前,这个问题最好的解决办法是使用JavaScript:
// set the height of the itemList to that of the container

$itemList.height($jumpList.height());

$itemList.width($jumpList.width());

这给了预期的效果:
{S3}
虽然缺乏一个像样的网格布局是令人沮丧的的,这是值得注意的HTML的首要重点是流布局,页面变化的高度上在它的内容为基础。垂直滚动的内容与HTML是相当自然。然而,Silverlight应用程序通常是约束到一个固定的屏幕尺寸,在桌面应用程序通常会以同样的方式。在此背景下,开发商通常安排UI控件填充可用空间。 HTML5可能不会有一个体面的网格布局,但相反的Silverlight没有一个体面的流布局,可以混合文本,图像,以及其他内容。
到目前为止,事情还没有过分!我花了太多时间超过继承模式强调,成为卡住我的脚本标记,并需要JavaScript代码来实现我需要的布局受挫。我有一种感觉,许多C#开发人员达到这个阶段,只是解雇的JavaScript。幸运的是,它得到更好的!{A32}创建jQueryUI部件
到目前为止,我的代码是不可怕的可重复使用的,位于硬编码控制与div元素。 jQuery有其自己的UI框架,名为{A33}。
重新编写上面的代码,作为一个jQueryUI部件是一个简单的过程,以下引用的博客文章中描述的简单模式。选项​​属性,它允许变量在创建一个部件时,通过创建一个对象。的_init函数是用来建立所需的UI小部件,使用上述相同的代码。唯一的区别是,Widget框架,而不是硬编码的CSS选择器在测试的HTML文档的div,设置this.element属性部件是要构建的DOM元素。
var JumpList = {

  // initial values are stored in the widget's prototype

  options: {

    items: []

  },



  // jQuery-UI initialization method

  _init: function () {



    var $jumpList = $(this.element),

              $itemList = $("<ul class='itemList'>");



    for (var i = 0; i < this.options.items.length; i++) {

      // add an item to the list

      var person = this.options.items[i];

      var $jumpListItem = $("<li class='jumpListItem'>").text(

                             person.surname + ", " + person.forename);

      $itemList.append($jumpListItem);

    }



    // add the item list

    $jumpList.append($itemList);



    // set the height of the itemList to that of the container

    $itemList.height($jumpList.height());

    $itemList.width($jumpList.width());



  }

};

最后,我们才可以使用这个小工具,我们必须登记如下:
在测试的HTML文件中使用的是下面一样简单:
最终的结果是,我们现在有一个可重复使用的部件,上面的语法给我们的潜力,创造多个构件实例,通过简单地使用CSS选择器匹配多个DOM元素。
别的颇为有趣的是通过注册的跳转表上述jQueryUI Widget框架中定义的对象,在这里,这导致在一个新的功能除了呢??代码>跳转表?? jQuery对象。这个工作究竟如何呢?
虽然你可以"假的??的方法除了现有各类在C#扩展方法的使用,使用JavaScript,,你可以加入一个函数对象的原型添加功能到现有的对象。这允许您添加新功能到现有对象(即中,{A34}),没有被传统的继承层次结构的制约。再次,这是经典的面向对象的继承是少到JavaScript相关的另一个原因。{A35}整理代码??JSLint
到目前为止,我还没有讨论工具和IDE。事实上,在发展的最初几个小时,我用记事本,记事本语法高亮,功能强大的搜索功能,插件,更开发。在我处理的JavaScript的IDE,我想看看在代码质量第一。
宽容的JavaScript语言和它的众多陷阱(或的性质的"坏零件??手段,这是很容易写很差构造难以维护的代码。道格拉斯Crockford的,作者的"好的部分的? ?写入和积极维护,提高JavaScript代码质量的静态分析工具JSLint。记事本{A36}上安装和运行此时,它发现了我的代码的问题,到目前为止,缺少分号除其他事项不一致的缩进,你会发现,JSLint往往拿起简单的拼写错误和语法错误以及文体的问题,所以每次运行JSLint之前刷新浏览器窗口,将节省您的时间。
一个特别有趣的问题,这JSLint拿起我的代码与下面的代码片段:
var $jumpList = $(this.element),

        $itemList = $("<ul class='itemList'>");



for (var i = 0; i < this.options.items.length; i++) {

  // add an item to the list

  var person = this.options.items[i];

  var $jumpListItem = $("<li class='jumpListItem'>").text(

                       person.surname + ", " + person.forename);

  $itemList.append($jumpListItem);

}

上面的代码,JSLint的意见,我应该"移动VAR声明的功能??这突出的JavaScript语言,C#开发的斗争的又一特色。首先,如果你省略了var关键字,则不会创建一个局部变量,而不是您将创建什么是一个有效的全局变量。其次,JavaScript并没有块级的范围,因此在上面的代码中定义的变量$ jumpListItem范围将包含它的功能。 JSLint鼓励你组对每个函数的开始所有变量声明,以避免混乱:
var $jumpList = $(this.element),

        $itemList = $("<ul class='itemList'>"),

        $jumpListItem,

        person,

        i;

            

for (i = 0; i < this.options.items.length; i++) {            

    // add an item to the list

    person = this.options.items[i];

    $jumpListItem = $("<li class='jumpListItem'>").text(

                      person.surname + ", " + person.forename);

    $itemList.append($jumpListItem);

}
{A37}编辑器和IDE
有一些Silverlight开发人员转移到HTML5意味着开沟赞成在记事本的Visual Studio中开了个玩笑。虽然IDE为JavaScript的支持并不好,因为它是C#和Java,那肯定是很多比使用记事本!
在Eclipse IDE中具有良好的JavaScript支持,您的代码和重构工具的结构提供意见。自动完成功能也明白JSDoc给你的功能编辑总结。 Eclipse还拥有一批建在代码质量检查,反映了很多的问题,JSLint识别。
Visual Studio中也大大提高了它的JavaScript支持;同时也不是那么良好的JavaScript文件作为Eclipse的结构,智能感知(自动完成)支持已大为改善。 IDE的伪执行为您的JavaScript代码,使其能够作出一个非常准确的的"猜测??在运行时可用的功能。例如,跳转表功能,其中的widget框架添加到jQuery的原型是可见的:
然而,这种方法有一定的局限性,例如,它没有确定如何你的JavaScript文件在运行时组装的方式,因此,你没有的jQuery API的IntelliSense,当编辑的jumpList.js文件!有办法,提供所需要的信息的IDE,但这些都不是有据可查的。有关详情,请参阅我的朋友{A38}。
Visual Studio中也缺乏体面的JavaScript代码的质量检查,但是卢克还开发了一个{A39}已开始成为开发商之间很受欢迎。
无论如何,足够的了解工具,让我们回到跳转表控制...{A40} jQuery的模板
随着当前正在进行的工作,姓和用的名字属性是硬编码到代码的部件,这大大降低了它的多功能性。为了解决这个问题,我们需要某种方式使开发人员可以指定一个模板,如何呈现他们的每一个项目的细节,例如,像Silverlight的DataTemplate的概念。无论的JavaScript也不HTML5有一个类似的概念,所以我们打算到别处寻找。这是一个共同的问题,如预期,也有无数的框架,提供了一个潜在的解决方案。混合在一起,而不是不同的JavaScript框架,我决定放弃{A41}(顺便说一句这是微软的书面!)尝试。
为模板,插件的API很简单,只是一个函数的jQuery对象。要使用此功能,我添加了一个ItemTemplate属性widget的选项。控件初始化时,此模板使用$编译每个项目模板功能,提供使用这个模板通过$ TMPL功能。
// 'compile' the template

$.template("itemTemplate", this.options.itemTemplate);



// add each item to the list

for (i = 0; i < this.options.items.length; i++) {

  item = this.options.items[i];

  // create the div that contains the item

  $jumpListItem = $("<li class='jumpListItem'>");

  // render the item using the named template

  $.tmpl("itemTemplate", item).appendTo($jumpListItem);

  // add the the jumplist

  $itemList.append($jumpListItem);

}

部件是现在完全脱钩,从对象的数组,它呈现,模板通过对实例的部件如下:
$(".jumpList").jumpList({

  items: people,

  itemTemplate : "<b>${surname}</b>, ${forename}"

});

上面的模板呈现在大胆的姓氏如下所示:
{五}{A42}添加跳转按钮
为了转成一个跳转列表中的项目清单,我们需要一种方法,给每个项目一个类别,并呈现这个类别,每个类别内的项目组以上。这是按钮,点击它时,显示类视图,因此被称为一个"跳跃键??
另一个选项属性添加到小部件??代码> categoryFunction??每个项目对应一个类别。在这里,我们采取的姓的首字母:
$(".jumpList").jumpList({

    items: people,

    itemTemplate: "${surname}, ${forename}",

    categoryFunction: function (person) {

        return person.surname.substring(0,1).toUpperCase();

    }

});

循环,建立项目清单,现在增加了跳跃按钮:
this._$itemList = $("<div class='itemList'/>");



// create the item list with jump buttons

for (i = 0; i < this.options.items.length; i++) {



    item = this.options.items[i];

    category = this.options.categoryFunction(item);



    if (category !== previousCategory) {

        previousCategory = category;



        // create a jump button and add to the list

        $jumpButton = $("<a class='jumpButton'/>").text(category);

        $jumpButton.attr("id", category.toString());



        $categoryItem = $("<li class='category'/>");

        $categoryItem.append($jumpButton);

        this._$itemList.append($categoryItem);



        // store a reference to the button for this category

        jumpButtons[category] = $jumpButton;

    }



    // create an item

    $itemMarkup = $("<div class='jumpListItem'/>");

    $.tmpl("itemTemplate", item).appendTo($itemMarkup);



    // associate the underlying object with this node

    $itemMarkup.data("dataContext", item);



    // add the item to the list

    $categoryItem.append($itemMarkup);

}

以上使用jQuery的data()函数的公告,这是一个伟大的小功能,可让您与DOM元素关联的任意数据。我在这里创建一个跳转列表和代表他们的DOM元素提供的项目之间的关系。我有所谓的DataContext点头到Silverlight功能这个模仿!
提供一些合适的CSS:
a.jumpButton

{

    background: #55FF55;

    margin: 7px;

    padding: 5px;

    width: 30px;

    height: 30px;

    display: block;

}

.jumpListItem

{

    margin: 10px;

}

跳转列表开始初具规模:
{中六}
注意的风格造成相当大的按钮,每个项目大约有大幅度的。这是因为它是在移动设备上,字体大小和命中区需要大于桌面上使用的。
添加单击事件处理程序,可以通过jQuery的点击()函数,和我第一次尝试在处理看着这样的跳转按钮的点击:
// create the item list with jump buttons

for (i = 0; i < this.options.items.length; i++) {

  ...



  if (category !== previousCategory) {

    ...



    // create a jump button and add to the list

    $jumpButton = $("<a class='jumpButton'/>").text(category);



    $jumpButton.click(function () {

      alert("category clicked: " + category);

    });

  }



  ...

}

然而,这并不功能相当的方式,你可能期望!点击任何跳跃按钮报告:
{七}
虽然在第一混乱,这样做的原因其实很简单。以前我们已经看到如何块级的范围,手段缺乏,JSLint鼓励你的变量声明移到函数的开始。因此,无论哪一个按钮被按下时,我们看到类的最终值。
这个问题可以通过一个非常有趣的语言功能,如没有发现在C#/ Java的解决。在单击处理程序所需的行为结果作以下修改:
$jumpButton.click(function (cat) {

  return function () {

    alert("category clicked: " + cat);

  };

} (category));

因此,这里发生了什么事情?这是两个有趣的概念在JavaScript的混合物。首先是即时的功能,这是其创作立即执行的功能。在这种情况下,我们正在创建一个函数,并立即调用它传递的类别。二是封闭,功能范围内的变量的引用"俘获??
使用闭包解决了这个问题,但实际上是有一个简单的方法,使用每类创建一个新的功能,而不是单一的功能,所以消耗内存少一些(考虑到内的变量的引用封函数的范围,他们可以是相当内存饥饿)。
鼠标事件冒泡的DOM在完全相同的方式,在Silverlight可视化树的事件冒泡。因此,一个简单的解决方案是将名单上的一个单一的点击事件处理程序,而不是在每个元素之一。
我想移动以外的初始化代码的事件处理程序,,以避免腹胀的功能,但是,这提出了另一个挑战。这个变量的一个函数内的值是依赖于在该函数调用方式。对于从DOM元素,如单击事件,引发的事件,这是一个事件源元素的引用。移动的事件处理程序的跳转表对象的属性,意味着我们不再通过这个跳转表对象的引用。
为了解决这个问题,各种jQuery的"包装??部件零部件拉出初始化函数跳转表对象的属性的对象。父div包含的项目和跳跃按钮的Click事件处理程序注册使用bind()函数,它允许你添加,将被传递给事件处理函数的数据。在这里,跳转列表的引用传递。事件处理程序可以再获得通过event.data财产,和源元素通过event.target属性(即,跳跃键或项目)的跳转列表的引用:
var JumpList = {



  // jQuery-UI initialization method

  _init: function () {



    ...



    // create the item list with jump buttons

    for (i = 0; i < this.options.items.length; i++) {



      ...

    }



    // add a click handler to the itemList

    this._$itemList.bind("click", { jumpList: this }, 

                         this._itemListClickHandler);



    ...



  },

  

  // Handles click on the itemlist, this is either a jump list item or

  // jump button click

  _itemListClickHandler: function (event) {

    var jumpList = event.data.jumpList,

            $sourceElement = $(event.srcElement);



    // handler jump list item clicks - resulting in selection changes

    if ($sourceElement.hasClass("jumpListItem")) {

      if (!$sourceElement.hasClass("selected")) {

        // remove any previous selection

        jumpList._$itemList.find(".selected").removeClass("selected");

        // select the clicked element

        $sourceElement.addClass("selected");

        // fire the event

        jumpList._trigger('selectionChanged', 0, 

                 $sourceElement.data("dataContext"));

      }

    }



    // handle jump button clicks

    if ($sourceElement.hasClass("jumpButton") === true) {

      // fade out the itemlist and show the categories

      jumpList._$itemList.addClass('faded');

      jumpList._$categoryList.addClass('visible');

      });

    }

  },



  _$itemList: undefined,

  _$categoryList: undefined,



  ...

};

上面的事件处理程序的分类视图显示,如果一个跳跃按钮被点击(更多关于这个版本),并实现一个非常简单的选拔机制,选定类中添加点击项目和提高SelectionChanged事件。在这里你可以看到使用了jQuery的data()函数来提取"的约束??项目,DOM元素的代表,模拟Silverlight的DataContext的概念。
我们可以添加此事件的处理程序的部件构造时:
如何选择,可短短5行代码实现自动创建的事件,这是令人印象深刻。{A43}动画"类别"按钮(您好CSS3的!)
的代码创建的类别按钮创建跳转列表按钮和项目的代码非常相似,所以我不会在这里重现。如果你有兴趣,可以挖周围的代码。
跳转列表的结果初始化以下结构创建的DOM元素:
<div class="jumpList">

  <ul class="itemList">

    <li class="category">

        <a class="jumpButton" id="A">A</a>

        <li class="jumpListItem">Afufylug, Efotda</li>

    </li>

    <li class="category">

        <a class="jumpButton" id="B">B</a>

        <li class="jumpListItem">Bastajcyr, Laej</li>

        <li class="jumpListItem">Bexgamila, Ryjl</li>

    </li>

    ...

  </ul>

        

  <div class="categoryList" >

     <a class="categoryButton">A</a>

     <a class="categoryButton">B</a>

     <a class="categoryButton">C</a>

     <a class="categoryButton">D</a>

        ...

  </div>

</div>

categoryList格样式在CSS中,使其覆盖ITEMLIST最初是隐藏的。
的Windows Phone 7跳转列表的版本有一个时髦的每个类别按钮,旋转和尺度进入视野揭示动画。
{S8}
让我们来看看它是多么容易重现使用CSS / HTML / JavaScript的?/ P>
CSS3规范增加了转型的支持,让您缩放,旋转和倾斜元素。这提供了非常相似的功能,Silverlight的的RenderTransform。我们可以定义为如下categoryButton国家的样式:
a.categoryButton

{

    opacity: 0;

    -webkit-transform: scale(0,0) rotate(-180deg);

}

        

a.categoryButton.show

{

    opacity: 1;

    -webkit-transform: scale(1.0, 1.0) rotate(0deg);

}

一类按钮的初始状态是透明的,与规模的零和旋转-180度。显示类是添加时,该按钮将变为可见,缩放/旋转到其原来的立场。
显示类应用将立即更改这些属性。为了顺利的旋转,缩放和透明度变化的动画,我们可以使用新的CSS3的过渡功能:
a.categoryButton

{

    -webkit-transition-property: -webkit-transform , opacity;

    -webkit-transition-duration: 0.3s;

}

最后,以火为序列中的每个元素的动画,点点代码是必需的吗??/ P>
下面的函数遍历一个元素的jQuery项目,对每个元素发射的一些行动(即函数)之间的一个短暂的延迟。一个布尔值,也传递给函数来表示时已经达成的最后一个元素:
// A function that invokes the given function for each of the elements in 

// the passed jQuery node-set, with a small delay between each invocation

_fireAnimations: function ($elements, func) {

  var $lastElement = $elements.last();

  $elements.each(function (index) {

    var $element = $(this);

    setTimeout(function () {

      func($element, $lastElement.is($element));

    }, index * 20);

  });

},

我们可以使用此功能,以动画隐藏的类别按钮,如下哪里了??代码>的说明了什么??类是从每个元素中删除,这将导致一个CSS3转换回原来的状态。当最后一个元素是,父div隐藏删除类别列表:
// hide the category buttons

jumpList._fireAnimations(jumpList._$categoryList.children(), 

          function ($element, isLast) {

  $element.removeClass('show');

  if (isLast) {

    jumpList._$categoryList.removeClass('visible');

  }

});

最终结果是,这是惊人的相似,我原来的Windows Phone 7实施的东西:
{S9}
这种效果的实现是相当简单,比我写的Windows Phone 7控制的等效代码更简洁。见以前的文章{A44}。
在这一点上,它是值得一说的关于供应商的特定CSS属性的东西。目前,因为过渡和转换的CSS规范尚未敲定,支持他们的浏览器使用每个属性的名称前的供应商特定的前缀。不幸的是,这意味着,如果你要使用这些最近的一些CSS特性,你面临着很多的重复。例如,我想禁用跳转列表中的文本选择。这就要求下面的CSS,以确保跨平台支持:
.jumpList

{

    -webkit-user-select: none;

    -khtml-user-select: none;

    -moz-user-select: none;

    -o-user-select: none;

    user-select: none;

}

这些前缀可以是非常令人沮丧和一个维护的问题东西。然而,他们是一个必要的邪恶。过去的经验表明,允许厂商实现CSS特性太早可能造成大规模的问题,因为在他的文章"前缀或Posthack Eric Meyer的介绍??/ A>。
因为我的主要目的是创建一个用于移动设备的的跨平台的跳转列表,我可以愉快地限制自己只使用WebKit的前缀,因为iPhone,Android和黑莓都使用WebKit的浏览器。{A45}滚动列表
循环,产生的类别按钮使用jQuery的data()函数创建一个每个类别按钮和它对应的跳跃键之间的关系。点击处理程序添加到categoryList格,其中包含每个类别按钮。同样,在此之前,我们已经涵盖在本文前面的模式。如果您感兴趣的细节,查看相关的源代码。
最后的任务,使跳转列表功能齐全的类别按钮被点击时,滚动列表,以正确的位置。使用jQuery的scrollTop功能,这样就可以实现。我们只需添加跳转按钮的位置到当前滚动位置如下:
jumpList._$itemListContainer.scrollTop(

     $jumpButton.position().top + jumpList._$itemListContainer.scrollTop());

再次,实施滚动功能已被证明很简单,在比较Silverlight的跳转列表。{A46}在移动滚动
一个全功能的跳转列表控制,我决定了它的时间来测试它在移动。载入一个网页,其中包含一个跳在我的Windows Phone 7的列表控件,我惊讶地发现,它表现不俗。目前版本的IE WP7的使用不支持HTML5 / CSS3的,但是CSS缓慢下降,所以控制仍然是功能齐全。烦人,我的HTML跳转列表比较顺利滚动??啊哈(如果你不是一个WP7的开发,你想知道为什么这很烦人,检查{A47公路}???.
然后我借朋友的Andr​​oid手机,配备了WebKit浏览器之一。在这一点上,我马上打了一个问题。跳转列表中拒绝滚动,无论哪种方式,我刷卡的屏幕。刮后多少头,事实证明,这是一个移动的WebKit浏览器的限制,有没有办法与一个"溢出滚动一个块级元素的内容??风格。正如你能想象,这是一个相当大的问题,已收到{A48}。
是我所有的徒劳的工作?幸运的是,这是一个开发HTML5的移动应用程序的人的共同问题,也有在互联网上提供的各种解决方案。我发现,第一个{A49}(如此命名,因为iPhone也有Webkit浏览器,所以出现此相同的错误),做的伎俩。它采取了JavaScript和跳转列表标记使用iScroll再造位,但它没有解决的问题。
最终的结果是非常密切的模仿我写在Silverlight中的跳转列表的,但附加了一个优点,它在iPhone上运行,iTouch的,Android,黑莓,并与即将到来的芒果释放(增加了HTML5的有点讽刺,支持),Windows Phone 7的。
控制在地铁风格是非常多,所以可能看出来移动设备上的一个Windows Phone以外的地方,但是,它一直试图跨平台的HTML移动开发的有用工具。{A50}结论
我有一个写HTML5跳转列表控制的乐趣很多,但这篇文章不是为了好玩刚(好吧,我想除非CodeProject上开始支付作者,主要是它!)。很显然HTML5的,引人注目的是上升的,而且,CSS3和过程中的JavaScript。我想看看HTML5的发展经验比较的Silverlight,并且要完全诚实... ...我很惊讶!
,真的让我吃惊的事情之一是我用JavaScript的生产力水平。我不是这种语言,但我肯定远不及作为精通用JavaScript(和相关技术),因为我与Silverlight。不过,我是能够创造出一个大致相当于跳跃列表控件的Silverlight一次在类似的时间量。
这可以归结到了一些东西,首先,也许是最明显的一个是JavaScript和CSS的简洁性质。比较端侧般的效果,实现纺丝瓷砖揭示??表明CSS3的是远远超过Silverlight的故事板简洁。此外,对CSS3转换不强迫你担心类型,你可以过渡的颜色和方式完全相同的立场。
然而,有另一个不太明显的原因,为什么我用JavaScript的生产力相对较高。与Silverlight(或WPF的WinForms,等等),当您创建一个新的控制,延长或修改现有的控制,你很远在现有框架控件公开的API的摆布。如果你发现自己需要做一些事情,原有的控制作者已决定并不重要,所以还没有暴露的API,你都面临着一个困难的技术挑战。例如,找到的项目,目前在Silverlight的ListBox控件可见涉及比较深的Silverlight框架的运作的知识。 JavaScript和HTML之间的关系感觉比C#和XAML之间的关系完全不同。由于存在的JavaScript,HTML,也CSS中,在自己的权利的技术,他们变得​​更松散的耦合比C#和XAML。出于这个原因,没有什么是"隐藏??,因此很容易延长现有的行为。
(作为不谈,我知道Silverlight可视化树,给出了一个类似DOM的接口,你可以浏览和修改将我写的{A51}正是为此目的;但是,它仍然不觉得松散耦合的JavaScript / HTML。
虽然我留下深刻印象的JavaScript / HTML的生产力,这是值得注意的,这已经从别人写一个新的控制的角度。我认为我的观点可能已略有不同,如果我把自己的位置在控制消费。历史感谢分享。科林埃伯哈特
科林埃伯哈特
科林埃伯哈特
科林埃伯哈特
科林埃伯哈特
谢谢!



科林埃伯哈特







科林埃伯哈特

科林埃伯哈特


科林埃伯哈特

科林埃伯哈特

回答