JQuery对DOM的操作
[TOC]
JQuery简介
$
是著名的jQuery符号。实际上,jQuery把所有功能全部封装在一个全局变量
jQuery
中,而$
也是一个合法的变量名,它是变量jQuery
的别名:1234window.jQuery; // jQuery(selector, context)window.$; // jQuery(selector, context)$ === jQuery; // truetypeof($); // 'function'$
本质上就是一个函数,但是函数也是对象,于是$
除了可以直接调用外,也可以有很多其他属性。
JQuery的选择器
通过id查找
12// 查找<div id="abc">:var div = $('#abc'); //返回的对象是jQuery对象,jQuery对象类似数组,它的每个元素都是一个引用了DOM节点的对象。获取到jquery对象之后即可获取dom对象。
123var div = $('#abc'); // jQuery对象var divDom = div.get(0); // 假设存在div,获取第1个DOM元素var another = $(divDom); // 重新把DOM包装为jQuery对象通过标签查找
12var ps = $('p'); // 返回所有<p>节点ps.length; // 数一数页面有多少个<p>节点通过class查找
123456789var a = $('.red'); // 所有节点包含`class="red"`都将返回// 例如:// <div class="red">...</div>// <p class="green red">...</p>//查找多个class属性的domvar a = $('.red.green'); // 注意没有空格!// 符合条件的节点:// <div class="red green">...</div>// <div class="blue green red">...</div>通过属性查找
123var email = $('[name=email]'); // 找出<??? name="email">var passwordInput = $('[type=password]'); // 找出<??? type="password">var a = $('[items="A B"]'); // 找出<??? items="A B">组合查找
1var emailInput = $('input[name=email]'); // 不会找出<div name="email">
层级选择器
首先要定位父节点,才能选择相应的子节点,这样避免了页面其他不相关的元素,缩小了选择范围。
如果两个DOM元素具有层级关系(只要是包涵关系都是层级关系),就可以用
$('ancestor descendant')
来选择,层级之间用空格隔开:12345678<!-- HTML结构 --><div class="testing"><ul class="lang"><li class="lang-javascript">JavaScript</li><li class="lang-python">Python</li><li class="lang-lua">Lua</li></ul></div>12$('ul.lang li.lang-javascript'); // [<li class="lang-javascript">JavaScript</li>]$('div.testing li.lang-javascript'); // [<li class="lang-javascript">JavaScript</li>]父子选择器
两个元素必须是父子关系才行(直接包涵不能隔代)。
12$('ul.lang>li.lang-javascript'); // 可以选出[<li class="lang-javascript">JavaScript</li>]$('div.testing>li.lang-javascript'); // [], 无法选出,因为<div>和<li>不构成父子关系过滤器
1234567$('ul.lang li'); // 选出JavaScript、Python和Lua 3个节点$('ul.lang li:first-child'); // 仅选出JavaScript$('ul.lang li:last-child'); // 仅选出Lua$('ul.lang li:nth-child(2)'); // 选出第N个元素,N从1开始$('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素$('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素
查找与过滤
查找
当我们那个某个dom的jquery对象之后,我们可以通过这个对象进行纵向或者横向查找它的兄弟,父子节点。
12345678<!-- HTML结构 --><ul class="lang"><li class="js dy">JavaScript</li><li class="dy">Python</li><li id="swift">Swift</li><li class="dy">Scheme</li><li name="haskell">Haskell</li></ul>123456789101112131415//通过find查找子节点var ul = $('ul.lang'); // 获得<ul>var dy = ul.find('.dy'); // 获得JavaScript, Python, Schemevar swf = ul.find('#swift'); // 获得Swiftvar hsk = ul.find('[name=haskell]'); // 获得Haskell//获取父节点var swf = $('#swift'); // 获得Swiftvar parent = swf.parent(); // 获得Swift的上层节点<ul>var a = swf.parent('div.red'); // 从Swift的父节点开始向上查找,直到找到某个符合条件的节点并返回//查找兄弟节点var swift = $('#swift');swift.next(); // Schemeswift.next('[name=haskell]'); // Haskell,因为Haskell是后续第一个符合选择器条件的节点swift.prev(); // Pythonswift.prev('.js'); // JavaScript,因为JavaScript是往前第一个符合选择器条件的节点过滤
通过filter过滤dom
1234567var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskellvar a = langs.filter('.dy'); // 拿到JavaScript, Python, Schemevar langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskelllangs.filter(function () {return this.innerHTML.indexOf('S') === 0; // 这里的this代表dom对象}); // 拿到Swift, Scheme
操作DOM
修改dom的内容
jQuery对象的
text()
和html()
方法分别获取节点的文本和原始HTML文本123456789<!-- HTML结构 --><ul id="test-ul"><li class="js">JavaScript</li><li name="book">Java & JavaScript</li></ul><script>$('#test-ul li[name=book]').text(); // 'Java & JavaScript'$('#test-ul li[name=book]').html(); // 'Java & JavaScript'</script>无参数调用
text()
是获取文本,传入参数就变成设置文本,HTML也是类似操作,1$('#test-ul li[name=book]').text('你好');由于jquery对象包含了可能不只一个对象,所以它的方法会作用在每一个dom对象上,即使没有对象也不会报错。
添加新的dom
通过append方法可以添加dom,对于之前html页面:
123456789101112131415var ul = $('#test-ul');//拿到父节点的对象ul.append('<li><span>Haskell</span></li>'); //添加dom对象// 创建DOM对象:var ps = document.createElement('li');ps.innerHTML = '<span>Pascal</span>';// 添加DOM对象:ul.append(ps);// 添加jQuery对象:不过会先删除原有的对象ul.append($('.js'));// 添加函数对象:ul.append(function (index, html) {return '<li><span>Language - ' + index + '</span></li>';});删除节点
12var li = $('#test-ul>li');li.remove(); // 所有<li>全被删除