从零开始学习jQuery (三) 管理jQuery包装集


Posted in Javascript onFebruary 23, 2011

一.摘要
在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着学习如何管理jQuery包装集, 比如添加,删除,切片等.

二.前言
本系列的2,3篇上面列举了太多的API相信大家看着眼晕. 不过这些基础还必须要讲, 基础要扎实.其实对于这些列表大家可以跳过, 等以后用到时再回头看或者查询官方的API说明.

本章内容很少, 主要讲解动态创建元素和操作jQuery包装集的各个函数.

三.动态创建元素
1.错误的编程方法
我们经常使用javascript动态的创建元素, 有很多程序员通过直接更改某一个容器的HTML内容.比如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>动态创建对象</title> 
</head> 
<body> 
<div id="testDiv">测试图层</div> 
<script type="text/javascript"> 
document.getElementById("testDiv").innerHTML = "<div style=\"border:solid 1px #FF0000\">动态创建的div</div>"; 
</script> 
</body> 
</html>

上面的示例中我通过修改testDiv的内容,在页面上动态的添加了一个div元素. 但是请牢记,这是错误的做法!

错误的原因:

(1) 在页面加载时改变了页面的结构. 在IE6中如果网络变慢或者页面内容太大就会出现"终止操作"的错误. 也就是说"永远不要在页面加载时改变页面的Dom模型".

(2) 使用修改HTML内容添加元素, 不符合Dom标准. 在实际工作中也碰到过使用这种方法修改内容后, 某些浏览器中并不能立刻显示添加的元素, 因为不同浏览器的显示引擎是不同的. 但是如果我们使用Dom的CreateElement创建对象, 在所有的浏览器中几乎都可以. 但是在jQuery中如果传入的而是一个完整的HTML字符串, 内部也是使用innerHTML. 所以也不是完全否定innerHTML函数的使用.

所以从现在开始请摒弃这种旧知识, 使用下面介绍的正确方法编程.

2.创建新的元素
下面介绍两种正确的创建元素的方式.

(1)使用HTML DOM创建元素
什么是 DOM?

通过 JavaScript,您可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目。

要改变页面的某个东西,JavaScript 就需要对 HTML 文档中所有元素进行访问的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。

在 1998 年,W3C 发布了第一级的 DOM 规范。这个规范允许访问和操作 HTML 页面中的每一个单独的元素。

所有的浏览器都执行了这个标准,因此,DOM 的兼容性问题也几乎难觅踪影了。

DOM 可被 JavaScript 用来读取、改变 HTML、XHTML 以及 XML 文档。

DOM 被分为不同的部分(核心、XML及HTML)和级别(DOM Level 1/2/3):
Core DOM
定义了一套标准的针对任何结构化文档的对象
XML DOM
定义了一套标准的针对 XML 文档的对象
HTML DOM
定义了一套标准的针对 HTML 文档的对象。
关于使用HTML DOM创建元素本文不做详细介绍, 下面举一个简单的例子:

//使用Dom标准创建元素 
var select = document.createElement("select"); 
select.options[0] = new Option("加载项1", "value1"); 
select.options[1] = new Option("加载项2", "value2"); 
select.size = "2"; 
var object = testDiv.appendChild(select);

通过使用 document.createElement 方法我们可以创建Dom元素, 然后通过appendChild方法为添加到指定对象上.
(2) 使用jQuery函数创建元素
在jQuery中创建对象更加简单, 比如创建一个Div元素:
$("<div style=\"border:solid 1px #FF0000\">动态创建的div</div>")
我们主要使用jQuery核心类库中的一个方法:

jQuery( html, ownerDocument )
Returns: jQuery

根据HTML原始字符串动态创建Dom元素.

其中html参数是一个HTML字符串,  在jQuery1.3.2中对此函数做了改进:

当HTML字符串是没有属性的元素是, 内部使用document.createElement创建元素, 比如:

//jQuery内部使用document.createElement创建元素: 
$("<div/>").css("border","solid 1px #FF0000").html("动态创建的div").appendTo(testDiv);

否则使用innerHTML方法创建元素:
//jQuery内部使用innerHTML创建元素: 
$("<div style=\"border:solid 1px #FF0000\">动态创建的div</div>").appendTo(testDiv);

3.将元素添加到对象上
我们可以使用上面两种方式创建一个而元素, 但是上面已经提到一定不要在页面加载时就改变页面的DOM结构, 比如添加一个元素. 正确的做法是在页面加载完毕后添加或删除元素.
传统上, 使用window.onload完成上述目的:
//DOM加载完毕后添加元素 
//传统方法 
window.onload = function() { testDiv.innerHTML = "<div style=\"border:solid 1px #FF0000\">动态创建的div</div>"; }

虽然能够在DOM完整加载后, 在添加新的元素, 但是不幸的是浏览器执行window.onload函数不仅仅是在构建完DOM树之后, 也是在所有图像和其他外部资源完整的加载并且在浏览器窗口显示完毕之后. 所以如果某个图片或者其他资源加载很长时间, 访问者就会看到一个不完整的页面, 甚至在图片加载之前就执行了需要依赖动态添加的元素的脚本而导致脚本错误.

解决办法就是等DOM被解析后, 在图像和外部资源加载之前执行我们的函数.在jQuery中让这一实现变得可行:

//jQuery 使用动态创建的$(document).ready(function)方法 
$(document).ready( 
function() { testDiv.innerHTML = "<div style=\"border:solid 1px #FF0000\">使用动态创建的$(document).ready(function)方法</div>"; } 
);

或者使用简便语法:
//jQuery 使用$(function)方法 
$( 
function() { testDiv.innerHTML += "<div style=\"border:solid 1px #FF0000\">使用$(function)方法</div>"; } 
);

使用$()将我们的函数包装起来即可. 而且可以在一个页面绑定多个函数, 如果使用传统的window.onload则只能调用一个函数.

所以请大家将修改DOM的函数使用此方法调用. 另外还要注意document.createElement和innerHTML的区别. 如果可以请尽量使用document.createElement和$("<div/>")的形式创建对象.
四.管理jQuery包装集元素
既然学会了动态创建元素, 接下来就会想要把这些元素放入我们的jQuery包装集中.

我们可以在jQuery包装集上调用下面这些函数, 用来改变我们的原始jQuery包装集, 并且大部分返回的都是过滤后的jQuery包装集.

jQuery提供了一系列的函数用来管理包装集:

1.过滤 Filtering

名称 说明 举例
eq( index ) 获取第N个元素 获取匹配的第二个元素: $("p").eq(1)
filter( expr ) 筛选出与指定表达式匹配的元素集合。 保留带有select类的元素: $("p").filter(".selected")
filter( fn ) 筛选出与指定函数返回值匹配的元素集合 这个函数内部将对每个对象计算一次 (正如 '$.each'). 如果调用的函数返回false则这个元素被删除,否则就会保留。 保留子元素中不含有ol的元素: $("div").filter(function(index) {   return $("ol", this).size() == 0; });
is( expr ) 注意: 这个函数返回的不是jQuery包装集而是Boolean值 用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true。 如果没有元素符合,或者表达式无效,都返回'false'. 'filter' 内部实际也是在调用这个函数,所以,filter()函数原有的规则在这里也适用。 由于input元素的父元素是一个表单元素,所以返回true: $("input[type='checkbox']").parent().is("form")
map( callback ) 将一组元素转换成其他数组(不论是否是元素数组) 你可以用这个函数来建立一个列表,不论是值、属性还是CSS样式,或者其他特别形式。这都可以用'$.map()'来方便的建立 把form中的每个input元素的值建立一个列表: $("p").append( $("input").map(function(){   return $(this).val(); }).get().join(", ") );
not( expr ) 删除与指定表达式匹配的元素 从p元素中删除带有 select 的ID的元素: $("p").not( $("#selected")[0] )
slice( start, end ) 选取一个匹配的子集 选择第一个p元素: $("p").slice(0, 1);

2.查找 Finding

名称 说明 举例
add( expr ) 把与表达式匹配的元素添加到jQuery对象中。这个函数可以用于连接分别与两个表达式匹配的元素结果集。 动态生成一个元素并添加至匹配的元素中: $("p").add("Again")
children( [expr] ) 取得一个包含匹配的元素集合中每一个元素的所有子元素的元素集合。 可以通过可选的表达式来过滤所匹配的子元素。注意:parents()将查找所有祖辈元素,而children()只考虑子元素而不考虑所有后代元素。 查找DIV中的每个子元素: $("div").children()
closest( [expr] ) 取得与表达式匹配的最新的父元素 为事件源最近的父类li对象更换样式: $(document).bind("click", function (e) {   $(e.target).closest("li").toggleClass("hilight"); });
contents( ) 查找匹配元素内部所有的子节点(包括文本节点)。如果元素是一个iframe,则查找文档内容 查找所有文本节点并加粗: $("p").contents().not("[nodeType=1]").wrap("");
find( expr ) 搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。 所有搜索都依靠jQuery表达式来完成。这个表达式可以使用CSS1-3的选择器语法来写。 从所有的段落开始,进一步搜索下面的span元素。与$("p span")相同: $("p").find("span")
next( [expr] ) 取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。 这个函数只返回后面那个紧邻的同辈元素,而不是后面所有的同辈元素(可以使用nextAll)。可以用一个可选的表达式进行筛选。 找到每个段落的后面紧邻的同辈元素: $("p").next()
nextAll( [expr] ) 查找当前元素之后所有的同辈元素。 可以用表达式过滤 给第一个div之后的所有元素加个类: $("div:first").nextAll().addClass("after");
offsetParent( ) 返回第一个有定位的父类(比如(relative或absolute)).  
parent( [expr] ) 取得一个包含着所有匹配元素的唯一父元素的元素集合。 你可以使用可选的表达式来筛选。 查找每个段落的父元素: $("p").parent()
parents( [expr] ) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。 找到每个span元素的所有祖先元素: $("span").parents()
prev( [expr] ) 取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合。 可以用一个可选的表达式进行筛选。只有紧邻的同辈元素会被匹配到,而不是前面所有的同辈元素。 找到每个段落紧邻的前一个同辈元素: $("p").prev()
prevAll( [expr] ) 查找当前元素之前所有的同辈元素 可以用表达式过滤。 给最后一个之前的所有div加上一个类: $("div:last").prevAll().addClass("before");
siblings( [expr] ) 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合。可以用可选的表达式进行筛选。 找到每个div的所有同辈元素: $("div").siblings()

3.串联 Chaining

名称 说明 举例
andSelf( ) 加入先前所选的加入当前元素中 对于筛选或查找后的元素,要加入先前所选元素时将会很有用。 选取所有div以及内部的p,并加上border类: $("div").find("p").andSelf().addClass("border");
end( ) 回到最近的一个"破坏性"操作之前。即,将匹配的元素列表变为前一次的状态。 如果之前没有破坏性操作,则返回一个空集。所谓的"破坏性"就是指任何改变所匹配的jQuery元素的操作。这包括在 Traversing 中任何返回一个jQuery对象的函数--'add', 'andSelf', 'children', 'filter', 'find', 'map', 'next', 'nextAll', 'not', 'parent', 'parents', 'prev', 'prevAll', 'siblings' and 'slice'--再加上 Manipulation 中的 'clone'。 选取所有的p元素,查找并选取span子元素,然后再回过来选取p元素: $("p").find("span").end()
五.常用函数举例
[待续]

六.总结
本篇文章内容较少, 主要讲解如何动态创建元素以及管理jQuery包装集, 接口文档列举了太多, 实例部分还没来得及写. 因为要睡觉明天还要上班, 所以请各位见谅, 等以后有空的时候补上!
作者:张子秋
出处:http://www.cnblogs.com/zhangziqiu/

Javascript 相关文章推荐
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
解析jquery中的ajax缓存问题
Dec 19 Javascript
jQuery实现自动调整字体大小的方法
Jun 15 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
jquery radio的取值_radio的选中_radio的重置方法
Sep 20 Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
Node.js 多线程完全指南总结
Mar 27 Javascript
js DOM的事件常见操作实例详解
Dec 16 Javascript
jQuery实现简单评论区功能
Oct 26 jQuery
jQuery的学习步骤
Feb 23 #Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
Feb 23 #Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 #Javascript
js操作textarea方法集合封装(兼容IE,firefox)
Feb 22 #Javascript
快速排序 php与javascript的不同之处
Feb 22 #Javascript
JavaScript传递变量: 值传递?引用传递?
Feb 22 #Javascript
JavaScript中的排序算法代码
Feb 22 #Javascript
You might like
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
jQuery动画animate方法使用介绍
2013/05/06 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
微信小程序实现animation动画
2018/01/26 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
简洁的十分钟Python入门教程
2015/04/03 Python
Python中的Matplotlib模块入门教程
2015/04/15 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
python实现上传下载文件功能
2020/11/19 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
Django如何将URL映射到视图
2019/07/29 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
IBatis持久层技术
2016/07/18 面试题
心理健康心得体会
2014/01/02 职场文书
《小池塘》教学反思
2014/02/28 职场文书
2014年元旦感言
2014/03/06 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python