KISSY之Node(1)

今日任务:学习Node模块,对拆合菜单实例代码进行优化重构.

前面我们分别讲解了DOM 和Event模块,那时是按照使用什么模块就引用什么模块的原则编写代码的。同时,我们也在Event章节提到过:通常DOM事件无需直接引用event,只需use('node')即可。使用use('base')时也无需手动引入 event。那么本节我们就来具体体会下Node模块的功能。

一、Node.one与DOM.get

one和get同样是获取符合选择器的第一个元素,但有本质上的区别,one属于node模块,而get属于dom模块。使用one意味着使用类似于jquery获取元素的方式,而get是类似YUI获取元素的方式,二者的返回值也是不同的,接下来以一个demo来具体演示其差别:

KISSY.use('node',function(S,Node){

var menu=Node.one("#menu");

alert(menu);

});

KISSY.use('dom',function(S,DOM){

var menu=DOM.get("#menu");

alert(menu);

});

效果图分别是:

可以看到二者的返回值是不一样的,使用Node模块的menu是object,而使用DOM模块的menu是HTNLUListElement。其实可以把one方法看做是对get的二次封装。当元素存在时,S.one返回的是Node实例(就可以使用类似jquery的链式调用,继续调用node的其他方法);不存在返回null。

二、Node.one的链式调用

在DOM章节里,有这样一段代码:

var menu = DOM.get("#menu");

Event.on('#btn-4','click',function(evt){

var menuChildrens = DOM.children(menu);

alert(menuChildrens.length);

});

用途是点击id为btn-4的按钮,弹出获取到的拆合菜单的子节点li的个数。那么下面看看用one如何实现这个功能:

KISSY.use('node',function (S,Node) {

var len= Node.one("#menu").children().length;

Node.one("#btn-4").on('click',function(){

alert(len);

});

});

代码是不是简洁多了?既然有children(),可以预见还有prev()、next()、parent()、text()等,只要是dom模块中的方法,node模块都有对应的接口。不仅是dom模块,event和anim模块中的方法,node模块都有对应的接口。

三、Node演练:向第二个子菜单添加新的菜单项

先来看看DOM章节的代码:

KISSY.use('dom,event', function (S,DOM,Event) {

//向第二个子菜单添加新的菜单项

Event.on('#btn-7','click',function(evt){

var menuChildrens = DOM.children(menu);

var secondUl = DOM.children(menuChildrens[1],'ul');

//创建一个新的li节点

var newLi = DOM.create('<li class="new"><a>test13</a></li>');

DOM.append(newLi,secondUl);

});

});

再来看下使用node的API的代码:

KISSY.use('node', function (S,Node) {

//向第二个子菜单添加新的菜单项

Node.one('#btn-7').on('click',function(){

Node.one("#menu").children().item(1).children('ul').append('<li class="new"><a>test13</a></li>');

});

});

一行代码搞定,node模块的简洁性是dom模块无法比拟的,如果你熟悉jquery,那么无疑可以快速掌握node模块用法,node模块的API命名,基本上与jquery的API保持一致,但有一些事不同的,这要留意,比如获取第二个子菜单,jquery是$("#menu").children('li').eq(1),而kissy是S.one("#menu").children().item(1)。

另外,对于Node的事件操作:

KISSY.use('node',function (S,Node) {

Node.one('#btn-3').on('click', function(e) {

e.halt();

alert('event: ' + e.type + ' target: ' + e.target.tagName);

});

});

弹出的窗口如下图:

回调传回一个门面对象e,注意e不是原生事件对象,是封装后的,这时e.target是裸的节点。除了preventDefault()和stopPropagation()之外,e还包含halt()方法,停止事件加阻止默认行为。

四、什么是nodelist

nodelist很好理解,就是节点集合,比如你要获取拆合菜单的三个li节点。

KISSY.use('node', function (S,Node) {

var list=Node.all("#menu li");

alert(list.length);

});

list长度是:

all遍历出了拆合菜单下的所有li,包括二级菜单的li。即,如果在上节的实例中结果将会是12。

查找节点集合最简单的办法即使用S.all,DOM 操作方法中,KISSY库会尽可能的返回节点集合,而非节点。通过nodeList[i]来获取第i个节点(从0开始计算)。

节点集合暴露each()方法,方便我们对节点集合进行遍历。对一个Nodelist执行attr方法,将返回第一个节点的属性值。

Node 实例支持逐级查找S.all('.s1').all('.s2')和S.all('.s1 .s2')是等价的。

S.all('.s1').all('.s2')和S.all('.s1 .s2')毕竟还是不同的,在一个多次遍历的场景中,无报错的情况下,通常第一个用法速度优于第二个,因为S.one始终从document根节点开始查找。

五、each

非常常用的一个方法,用于遍历节点集合。

KISSY.use('node', function (S,Node) {

//向第二个子菜单添加新的菜单项

Node.one('#btn-9').on('click',function(evt){

Node.all("#menu div").each(function(o,i){

var txt = o.text();

if(txt == 'test2') alert(i);

});

});

});

弹出的窗口是:

each的参数为一个函数,该函数带有2个参数,一个是元素(KISSY.Node的实例),一个是元素索引值。

当然,关于Node模块以上内容是远远不够的,但是,相信学习到现在,一定对KISSY的理解更加深入了。还有些方法equals、item、slice、append、appendTo、insertBefore等等都很重要,请查看API文档自行理解学习。

KISSY基础篇乄KISSY之Node(1)相关推荐

  1. KISSY基础篇乄KISSY之DOM(1)

    KISSY之DOM(1) 今日任务:了解学习DOM的基础知识以及学习拆合菜单实例 KISSY的DOM模块的子模块和方法众多,但又很重要,最好的情况是全部熟练掌握,当然一开始学是不可能全部记住DOM的方 ...

  2. KISSY基础篇乄KISSY简介

    KISSY简介 今日任务:了解学习有关Kissy的一些知识,以便于后续的学习 一.相约KISSY,必先了解 KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScript 框架.除了完备的 ...

  3. KISSY基础篇乄KISSY之HelloWorld

    KISSY之HelloWorld 今日任务:使用kissy实现简单的hello World! 一.新建Kissy测试项目 打开STS,File->StaticWeb Project,命名其Pro ...

  4. KISSY基础篇乄KISSY之Node(2)

    KISSY之Node(2) 今日任务:学习Node模块有关动画效果的方法. 在学习Anim模块之前,先看看Node模块里有关动画效果的方法的实现.查看相应的API 文档你会发现一些有关动画效果的方法: ...

  5. KISSY基础篇乄KISSY之Event

    KISSY之Event事件 今日任务:了解学习Event事件的基础知识 Event 模块是KISSY最重要的模块之一,他包含自定义事件机制.事件对象封装.DOM事件封装.面向多终端的事件行为统一.下辖 ...

  6. KISSY基础篇乄KISSY之Seed

    KISSY之Seed 今日任务:了解Kissy的模块载入机制 首先恭喜你已经成功使用kissy想世界打了个招呼,不过这只是刚起步,咱们还有很多地方需要学习.在本节咱们就推开kissy的大门,看看房间里 ...

  7. KISSY基础篇乄KISSY之IO(2)

    第14天:KISSY之IO(2) 今日任务:创建Maven Project并学习IO模块. 这一节我们主要来看一下IO模块里的一些方法. 一.Maven Project (1)创建mavenproje ...

  8. KISSY基础篇乄KISSY之DOM(2)

    KISSY之DOM(2) 今日任务:深入学习DOM知识及进一步完善拆合菜单实例 在上一篇的教程中,明河使用KISSY.DOM的常用方法制作了一个拆合菜单,同时也演练到了几个常用方法,比如addClas ...

  9. KISSY基础篇乄KISSY之IO前奏

    KISSY之IO前奏 今日任务:了解学习IO模块之前必备知识. 在学习Kissy的IO之前,咱们先来了解下ajax,http,json等知识,这些是学习IO模块的必备知识.这里只是给出了一些概念性的介 ...

最新文章

  1. NYOJ 745 蚂蚁问题(两)
  2. 14. 表单标签及其应用实例
  3. Machine Learning——octave矩阵操作(2)——DAY3
  4. unity3d UGUI视频教程
  5. MySQL必会企业面试题
  6. 信息学奥赛一本通(1412:二进制分类)
  7. MTK 驱动开发(3)---GPIO口的使用方法汇总
  8. Spring框架----基于接口的动态代理
  9. android自定义view流程,Android 自定义View--从源码理解View的绘制流程
  10. div中赋值html字符串
  11. 有线电信服务全球市场:未来三年复合年增长率将放缓
  12. 【smart-transform】取自Atom的babeljs/cs/ts智能转es5 库
  13. python暂停和恢复_Scrapy如何暂停/恢复工作?
  14. 数据结构 KMP 算法实现
  15. 用c#实现 catia插件speos的部分功能
  16. ArcGIS教程:对镶嵌数据集进行色彩平衡
  17. 2014图灵奖--迈克尔·斯通布雷克简介
  18. 用.NET做DDNS动态域名解析和SSL证书申请
  19. 2020-12-6 CCF201803-2 碰撞的小球
  20. ios企业版如果证书过期了_iOS 企业证书过期填坑记

热门文章

  1. Linux全局替换文件内容
  2. CAD梦想画图中的“绘图工具——点”
  3. 一文掌握华为全过程项目管理的方法步骤和具体动作【墙裂推荐】
  4. 51单片机物联网开发
  5. Scrapy 通用爬虫爬取广西人才网数据记录(上,企业信息)
  6. 服务器文件ansi,ansi编码文件在服务器上显示乱码
  7. ubuntu docker dm_task_run failed error
  8. 从苏宁电器到卡巴斯基第34篇:我与卡巴斯基的邂逅(上)
  9. 有人退税近4000元!个税年度汇算开始了,看看你能退多少?
  10. 什么是LoRaWAN