一、DOM对象和jQuery对象
1.1 区别
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>jQuery Demo</title>
</head>
<body>
<div id="div">div</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var DOMObject = document.getElementById('div');
var jQueryObject = $('#div');
console.log(DOMObject);
console.log(jQueryObject);
})
</script>
</body>
</html>
执行:
1.2 检测
- DOM Object:
if(obj.nodeType)
- jQuery Object:
if(obj.jquery)
一个栗子:
<div id="div">div</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var DOMObject = document.getElementById('div');
var jQueryObject = $('#div');
console.log(DOMObject.nodeType);
console.log(jQueryObject.jquery); // 打印出jQuery版本号
console.log(jQueryObject.nodeType);
console.log(DOMObject.jquery);
})
</script>
1.3 转换
DOM obj -> jQuery obj:var jqueryObj = $(domObj);
jQuery obj -> DOM obj:var domObj = jqueryObj.get([index]);
一个栗子:
<div id="div">div</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var DOMObject = document.getElementById('div');
var jQueryObject = $('#div');
console.log(DOMObject);
console.log(jQueryObject);
console.log($(DOMObject));
console.log(jQueryObject.get(0));
})
</script>
二、如何创建HTML元素
2.1 如何创建
$('<div>Hello </div>');
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var div = $('<div>Hello</div>');
console.log(div);
})
</script>
但是创建出来的元素没有放到页面上之前,这个元素是存在内存中的,通过选择器是选择不到的:
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var div = $('<div>Hello</div>');
console.log(div);
console.log($('div'));
})
</script>
通过appendTo将创建出来的元素放到页面上:
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var div = $('<div>Hello</div>');
console.log(div);
div.appendTo('body'); # 将创建的div追加到body元素最后面
console.log($('div'));
})
</script>
2.2 设置属性
方法一:
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var link1 = $('<a>', { // 注意,必须为空元素,如<a>onefine</a>是无效的。
text: 'baidu',
href: 'http://www.baidu.com',
target: '_blank',
title: 'goto baidu'
});
link1.appendTo('body');
})
</script>
方法二:
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var link1 = $('<a>', { // 注意,必须为空元素,如<a>onefine</a>是无效的。
text: 'baidu',
href: 'http://www.baidu.com',
target: '_blank',
title: 'goto baidu'
});
link1.appendTo('body');
var link2 = $('<a>baidu</a>').attr({
href: 'http://www.baidu.com',
target: '_blank',
title: 'goto baidu'
});
link2.appendTo('body');
})
</script>
三、检查和获取元素
3.1 检查元素数量
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
</ul>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var elements = $('li');
// 获取元素的数量
console.log(elements.length);
})
</script>
一个栗子——对不存在的元素进行操作:
$(function () {
var elements = $('li');
// 获取元素的数量
console.log(elements.length);
var elements2 = $('div');
console.log(elements2[0].style.color = 'blue');
// elements2[0] 和 elements2.get(0)效果一样,都是将jQuery对象转换为DOM对象
})
这是由于所选择的元素不存在,所以后面的操作失败:
var elements2 = $('div');
console.log(elements2.get(0)); // 返回undefined
由于大部分jQuery方法默认增加了对元素数量的判断,在调用绝大部分jQuery方法的时候是不会报错的,比如eq方法:
var elements2 = $('div');
console.log(elements2.eq(0).addClass('blue'));
3.2 提取元素——正序都从0开始编号
- [index]:返回DOM元素
- get([index]):返回DOM元素或元素集合,此方法和上一个得到的结果是一样的(对上一个方法做了增强),只不过不传递参数(索引)会获取一个元素的集合(详下面的例子)
- eq(index):返回jQuery对象
- first():获取第一个元素
- last():获取最后一个元素
- toArray():将jQuery对象之间转换为DOM元素的一个数组
更多详jQuery官网文档: http://api.jquery.com/
get做了增强
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
</ul>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var elements = $('li');
console.log(elements[0]);
console.log(elements.get(0));
console.log(elements.get()); // 不加索引返回所有元素
console.log(elements.get(-1)); // 从后往前获取元素,从1开始编号
console.log(elements.get(-4));
console.log(elements[100]); // 越界两者都返回undefined
console.log(elements.get(100));
console.log(elements.get(-100));
})
</script>
eq方法返回的是jQuery对象
<script>
$(function () {
var elements = $('li');
console.log(elements.eq(0));
console.log(elements.eq()); // 不加索引返回什么都不反回,和get相区别
console.log(elements.get());
})
</script>
eq方法与eq筛选器
这两者都能得到同样的结果,但推荐首选使用eq方法,因为eq方法的性能比eq筛选器的性能高很多:
<script>
$(function () {
var elements = $('li');
console.log(elements.eq(0)); // 推荐使用
console.log($('li:eq(0)'));
})
</script>
eq方法与get方法传入负值
<script>
$(function () {
var elements = $('li');
console.log(elements.eq(-1)); // 返回jQuery对象
console.log(elements.get(-1)); // 返回DOM对象
})
</script>
获取第一个元素和最后一个元素的快捷方式
- first()
- last()
注意:first和last方法对应也有筛选器的形式,但是性能不如方法,所以一般不介意使用筛选器。
console.log(elements.first());
console.log(elements.last());
toArray()方法和get()方法类似
console.log(elements.toArray());
console.log(elements.get());
四、通过关系查找jQuery对象
- parents():能够获取所选元素的所有父元素。
- parent([selector]):
- parentsUntil([selector]):获取所选元素的所有直到选择器之前的父元素。
- children([selector]):能够获取所选元素的第一个直接子元素。
- contents():返回文本节点
- find(selector):通过选择器来筛选其中所有的后代元素,包括子孙元素
- closest(selector):首先检查当前元素是否匹配,否则逐级向上寻找,直至返回一个空的jQuery对象。
兄弟姐妹元素查找jQuery对象的方法:
- next([selector]):往后,取得当前元素之后紧邻的一个同辈元素。
- nextAll([selector]):取得当前元素之后的所有同辈元素。
- nextUnitl([selector]):取得当前元素之后的所有同辈元素直到遇到匹配的元素为止。
- prev([selector]):往前,完全查找同辈元素,与next相似
- prevAll([selector]):
- prevUntil([selector]):
- siblings([selector]):同时往前往后,取得元素的所有同辈元素的元素集合,即吧元素的所有兄弟姐妹全部取出来。
4.1 parents方法
<div id="box">
<div>
<div>
<p id="info">Lorem ipsum dolor sit amet.</p>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var element = $('#info').parents();
console.log(element);
})
</script>
但是这里获取出了所有的父元素,也可以在parents方法中添加参数实现对所有父元素进行过滤:
var element = $('#info').parents('div');
console.log(element);
4.2 children方法
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
var element = $('#box').children();
console.log(element);
var element2 = $('#box > *'); // 子元素选择器效果和上面一样
console.log(element2);
})
</script>
不过children方法不反回文本节点如p标签内的内容,如果要返回文本节点可以使用contents方法:
<script>
$(function () {
var element = $('#info').children();
console.log(element);
})
</script>
4.3 contents()方法
<script>
$(function () {
var element = $('#info').children();
console.log(element);
var element2 = $('#info').contents();
console.log(element2);
})
</script>
<script>
$(function () {
var element = $('#box').children();
console.log(element);
var element2 = $('#box').contents();
console.log(element2);
})
</script>
可见children只返回了div,但contents返回了所有的文本节点(空格、换行)。
4.4 find()方法
<script>
$(function () {
var element = $('#box').find('p');
console.log(element);
})
</script>
4.5 兄弟姐妹选择器
console.log($('.item-4').next('li'));
console.log($('.item-4').nextAll('li'));
console.log($('.item-4').nextUntil('.item-6')); // 不包括.item-6
console.log($('.item-4').nextUntil('.item-xxx')); // 等价于nextUntil(),直到最后。。和nextAll类似
console.log($('.item-4').prev('li'));
console.log($('.item-4').prevAll('li'));
console.log($('.item-4').prevUntil('.item-1'));
console.log($('.item-4').prevUntil('.item-6'));
console.log($('.item-4').siblings('li')); // 取出的元素不包含自身
4.6 其他注意
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('#box3').children());
console.log($('#box3').contents());
})
</script>
console.log($('#box3').children('ul'));
console.log($('#box3').contents('ul'));
console.log($('#box3').find('.item-3'));
console.log($('#info').parent());
console.log($('#info').parents());
console.log($('#info').parent('#box3'));
console.log($('#info').parents('#box3'));
console.log($('#info').parent('#box2'));
console.log($('#info').parents('#box2'));
console.log($('#info').parent('#box2'));
console.log($('#info').parents('#box2'));
console.log($('#info').parentsUntil('#box2'));
console.log($('#info').parentsUntil('#box1'));
所以,parentsUntil只获取到选择器之前的所有父元素。
console.log($('#info').parent('#box2'));
console.log($('#info').parents('#box2'));
console.log($('#info').parents('#info'));
console.log($('#info').closest('#box2'));
console.log($('#info').closest('#info'));
console.log($('#info').parents('div'));
console.log($('#info').closest('div'));
4.7 添加元素(选择多个元素)
- add(selector)
console.log($('.item-4, .item-1'));
console.log($('.item-4').add('.item-1').add('.item-7'));
4.8 过滤元素(删除不想要的元素)
- not(selector)
- filter(selector):与not相反
- has(selector):保留包含特定后代的元素,去掉不包含这些指定后代的元素
console.log($('li'));
console.log($('li').not('.item-4'));
console.log($('li').not('.item-4'));
console.log($('li').filter('.item-4'));
注意,not和filter的参数不止可以是一个选择器,还可以是一个函数:
console.log($('li').not(function(index) {
return $(this).hasClass('item-4')
// $(this)返回的是每一个jQuery对象——此函数调用的对象
// hasClass('item-4'):检查是否拥有名为item-4的类
}));
console.log($('li').filter(function(index) {
return $(this).hasClass('item-4')
}));
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('li').has('ul'));
console.log($('#box1').has('ul'));
})
</script>
4.10 获取子集
- slice(start [, end]) :根据开始和结束的索引位置来选取匹配的子集
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('li').slice(0));
console.log($('li').slice(0,3));
})
</script>
console.log($('li').slice(4));
console.log($('li').slice(4, 6)); // 左闭右开,编号从0开始,编号为4,其实选择的是第5个元素
console.log($('li').slice(6, 4));
console.log($('li').slice(-4));
console.log($('li').slice(-4, -5));
console.log($('li').slice(-6, -4));
4.11 转换元素
- map(callback):将一个jQuery对象转换为另一个jQuery对象——具体由callback决定。
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('div').map(function (index, domElement) {
return this.id; // id是DOM对象的属性
// 等价:return $(this)[0].id;
// this指向当前执行map回调函数的元素的DOM元素domElement,等价:return domElement.id;
}));
})
</script>
当回调函数返回none或者undefined会怎样呢?
<script>
$(function () {
console.log($('div').map(function (index, domElement) {
return null || undefined;
// 一旦返回null或者undefined,此元素就会被跳过,返回值就不会加入到集合中。
}));
})
</script>
4.12 遍历元素
- each(iterator)
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('div').each(function (index, domElement) {
this.title = this.innerText;
}));
})
</script>
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('li').each(function (index, domElement) {
this.title = this.innerText;
}));
})
</script>
$(function () {
console.log($('div').each(function (index, domElement) {
if(this.id === 'box1'){
return true; // 相当于continue
// return false; // 相当于break
}
this.title = this.id;
}));
})
<script>
$(function () {
console.log($('div').each(function (index, domElement) {
if(this.id === 'box2'){
// return true; // 相当于continue
return false; // 相当于break
}
this.title = this.id;
}));
})
</script>
4.13 jQuery对象的其他操作
- is(selector):元素里面至少有一个符合给定的参数返回true
- end():回到最近的一次破坏性操作之前,将匹配的元素集合变成前一次的状态。
- addBack([selector]):
破坏性操作: 任何对jQuery对象进行改变的操作。如:删除元素、not()、filter()、map()、not()、children()、find()、next()、parent()等等
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('#box3').children().is('p'));
console.log($('#box3').children().is('li'));
console.log($('#box3').children().is('img'));
})
</script>
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log($('#box3').find('.item-4').css('color', 'red'));
})
</script>
<div id="box1">
<div id="box2">
<div id="box3">
<p id="info">Lorem ipsum dolor sit amet.</p>
<ul>
<li class="item-1">item-1-x</li>
<li class="item-2">item-2-x</li>
<li class="item-3">item-3-x</li>
<li class="item-4">item-4-x</li>
<li class="item-5">item-5-x</li>
<li class="item-6">item-6-x</li>
<li class="item-7">item-7-x</li>
<li class="item-8">
<ul></ul>
</li>
</ul>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script>
$(function () {
console.log(
$('#box3').find('.item-4').css('color', 'red')
.end()
.find('.item-6').css('color', 'green'));
})
</script>
console.log($('#box3').find('.item-4'));
console.log($('#box3').find('.item-4').end());
注意:使用end时必须保证是破坏性操作,如果不是破坏性操作,end方法什么都不会去返回,返回一个空对象。
console.log($('#box3').end());
<script>
$(function () {
console.log($('.item-4').nextUntil('.item-6'));
console.log($('.item-4').nextUntil('.item-6')
.addBack().css('color', 'orange'));
})
</script>