首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

HTML5 组件 实现标准组件(3)立即实现 Web 组件 Polymer

HTML5 组件 实现标准组件(3)立即实现 Web 组件 Polymer

立即实现 Web 组件我在本文中讨论的所有 Web Components API  都是相对较新的,各个浏览器供应商对它们的支持程度各不相同。为了立即有效实现这些组件,不能只编写代码并将代码加载到浏览器中;还需要知道在 HTML5 业务中哪些内容是 polyfillshim:允许您使用新功能(如果可用的话)的解决方案,但在不可用时,会返回一个受支持的备用解决方案。
目前,有两个项目提供了 Web Components polyfill:Polymer 和 Mozilla X-Tags。Polymer 只能在 Chrome  中使用,并需要一个 Web 服务器来使用 HTML 导入,它不适于生产。X-Tags  几乎可以在所有现有浏览器中使用,不需要 Web 服务器;但是,X-Tags 只实现定制元素 API,不能实现模板和 Shadow DOM。
接下来,我将分别向您展示如何使用 Polymer 和 X-Tags,将一个标准组件包装在本系列的上一篇文章中实现的专属滑块中。
Polymer按照定义,专属组件不需要遵循组件标准,因此没有实现或使用它们的标准方法。但是,通过将它们包装在标准组件中,可以使它们更易于使用。首先,我使用 Polymer 将这个专属滑块包装在一个标准组件中。图 8 显示了该滑块的 Polymer 版本:
图 8. 一个 polymer 滑块清单 5 显示了如何使用滑块的 Polymer 版本:
清单 5. 使用 Polymer 滑块标签
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
  <head>
     <title>Slider with Polymer</title>
   <script src="../polymer/polymer.js"></script>
   <script src="lib/slider.js"></script>
   <link rel="import" href="./slider.html" />
  </head>
   
  <body>
    <x-slider id='slider'
               fillColor='goldenrod'
               strokeColor='red'>
    </x-slider>
  </body>
</html>




如果将  和本系列第一篇文章中的清单 2(它显示了如何单独使用该专属滑块)进行比较,您会发现  显然更简单一些。您可以使用 x-slider元素创建一个只有一行 HTML 代码的滑块。
x-slider element是在清单 6 中实现的:
清单 6. Polymer 滑块组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<element name="x-slider" attributes="strokeColor fillColor">
  <template>
    <style>
       x-slider {
          display: block;
       }

       .x-slider-button {
          float: left;
          margin-left: 2px;
          margin-top: 5px;
          margin-right: 5px;
          vertical-align: center;
          border-radius: 4px;
          border: 1px solid rgb(100, 100, 180);
          background: rgba(255, 255, 0, 0.2);
          box-shadow: 1px 1px 4px rgba(0,0,0,0.5);
          cursor: pointer;
          width: 25px;
          height: 20px;
       }

       .x-slider-button:hover {
          background: rgba(255, 255, 0, 0.4);
       }

       #xSliderDiv {
          position: relative;
          float: right;
          width: 80%;
          height: 65%;
       }
    </style>

    <div id='x-slider-buttons-div'
         style='width: {{width}}px; height: {{height}}px;'>

       <button class='x-slider-button' id='xSliderMinusButton'>-</button>
       <button class='x-slider-button' id='xSliderPlusButton'/>+</button>
       <div id='xSliderDiv'></div>

    </div>
  </template>

  <script>
    Polymer.register(this, {
        width: 350,
        height: 50,
        strokeColor: 'blue',
        fillColor: 'cornflowerblue',

        ready: function () {
          var self = this,
              slider = new COREHTML5.Slider(this.strokeColor,
                                            this.fillColor, 0);

          setTimeout( function () { // This timeout is a hack
            slider.appendTo(self.$.xSliderDiv);
            slider.draw();
          }, 200);

          this.$.xSliderMinusButton.onclick = function () {
            if (slider.knobPercent >= 0.1) {
              slider.knobPercent -= 0.1;
              slider.erase();
              slider.draw();
            }
          };

          this.$.xSliderPlusButton.onclick = function () {
            if (slider.knobPercent <= 0.9) {
              slider.knobPercent += 0.1;
              slider.erase();
              slider.draw();
            }
          };
        }
    });

  </script>
</element>




类似于  。这两个清单都定义了一个新元素,并向 Polymer 全局对象注册该元素。它们还定义了一个包含 CSS 样式和标记的模板。 与  的区别是:清单 6 使用了 Polymer  数据绑定和一个 ready事件处理程序。
双大括号(如 {{width}})表示一个元素属性。您可以在您的元素标记中使用双大括号。在  中,我将元素的封闭 DIV的宽和高设置为页面作者使用元素属性设置的宽和高。
您可以在一个对象中声明属性,该对象可传递到 Polymer.register()方法;例如,  为 x-slider元素声明了 4 个属性:width、height、strokeColor和 fillColor。如果您使用 element元素的 attributes属性来指定属性(也称为 发布属性),页面制作者可在其元素中使用那些属性,就像  中的 x-slider元素一样。
根据 Polymer 文档的记载,当一个组件已经完成其自身的初始化之后,它将调用其 ready()方法(如果该方法存在的话)。该文档没有进一步详细介绍何时对组件进行初始化,但该操作显然是在浏览器准备绘制组件之前完成的。因为是在准备绘制组件之前对组件进行初始化的,而且此时 ready()方法是生命周期中的惟一方法,所以我必须添加一个 setTimeout()程序 (hack),该程序在调用 ready()方法后的 200 毫秒后绘制了一个滑块。像这样的不完善之处无疑会随时间逐渐消失。(Web Components 规范还定义了一个 inserted回调函数,在将一个元素插入 DOM 后,浏览器会调用此函数,但是在本文发布时 Polymer 还不支持此函数。)
Polymer 也提供一个关于定制元素的 $属性,参考了元素属性的映射。我使用该映射来访问最终包含该专属滑块的 DIV。
返回列表