查找
用find()
查找
如果要从当前节点开始向上查找,使用parent()
方法
对于位于同一层级的节点,可以通过next()
和prev()
方法
过滤
filter()
方法可以过滤掉不符合选择器条件的节点
map()
方法把一个jQuery对象包含的若干DOM节点转化为其他对象
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var arr = langs.map(function () {
return this.innerHTML;
}).get(); // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell']
text() 和 html
jQuery对象的text()
和html()
方法分别获取节点的文本和原始HTML文本,
css()
$('#test-css li.dy>span').css('background-color', '#ffd351').css('color', 'red');
var div = $('#test-div');
div.css('color'); // '#000033', 获取CSS属性
div.css('color', '#336699'); // 设置CSS属性
div.css('color', ''); // 清除CSS属性
注意,jQuery对象的所有方法都返回一个jQuery对象(可能是新的也可能是自身),这样我们可以进行链式调用,非常方便。
显示和隐藏DOM
考虑到显示和隐藏DOM元素使用非常普遍,jQuery直接提供show()
和hide()
方法获取DOM信息
// 浏览器可视窗口大小:
$(window).width(); // 800
$(window).height(); // 600
// HTML文档大小:
$(document).width(); // 800
$(document).height(); // 3500
// 某个div的大小:
var div = $('#test-div');
div.width(); // 600
div.height(); // 300
div.width(400); // 设置CSS属性 width: 400px,是否生效要看CSS是否有效
div.height('200px'); // 设置CSS属性 height: 200px,是否生效要看CSS是否有效
attr()
和removeAttr()
方法用于操作DOM节点的属性:
// <div id="test-div" name="Test" start="1">...</div>
var div = $('#test-div');
div.attr('data'); // undefined, 属性不存在
div.attr('name'); // 'Test'
div.attr('name', 'Hello'); // div的name属性变为'Hello'
div.removeAttr('name'); // 删除name属性
div.attr('name'); // undefined
attr()
和prop()
对于属性checked
处理有所不同:
var radio = $('#test-radio');
radio.attr('checked'); // 'checked'
radio.prop('checked'); // true
prop()
返回值更合理一些。不过,用is()
方法判断更好:
var radio = $('#test-radio');
radio.is(':checked'); // true
类似的属性还有selected
,处理时最好用is(':selected')
。对于表单元素,jQuery对象统一提供val()
方法获取和设置对应的value
属性:
添加DOM
要添加新的DOM节点,除了通过jQuery的html()
这种暴力方法外,还可以用append()
方法ul.append('<li><span>Haskell</span></li>');
append()
把DOM添加到最后,prepend()
则把DOM添加到最前。另外注意,如果要添加的DOM节点已经存在于HTML文档中,它会首先从文档移除,然后再添加,也就是说,用append()
,你可以移动一个DOM节点。
也就是说,同级节点可以用after()
或者before()
方法。
删除节点
要删除DOM节点,拿到jQuery对象后直接调用remove()
方法就可以了
动画
show / hide
直接以无参数形式调用show()
和hide()
,会显示和隐藏DOM元素。但是,只要传递一个时间参数进去,就变成了动画
toggle()
方法则根据当前状态决定是show()
还是hide()
。slideUp / slideDown
slideUp()
和slideDown()
则是在垂直方向逐渐展开或收缩的 slideToggle()
则根据元素是否可见来决定下一步动作:
fadeIn / fadeOut
fadeIn()
和fadeOut()
的动画效果是淡入淡出,也就是通过不断设置DOM元素的opacity
属性来实现,而fadeToggle()
则根据元素是否可见来决定下一步动作:自定义动画
animate()
,它可以实现任意动画效果,我们需要传入的参数就是DOM元素最终的CSS状态和时间,jQuery在时间段内不断调整CSS直到达到我们设定的值:
animate()
还可以再传入一个函数,当动画结束时,该函数将被调用
串行动画
jQuery的动画效果还可以串行执行,通过delay()
方法还可以实现暂停,这样,我们可以实现更复杂的动画效果,而代码却相当简单// 动画效果:slideDown - 暂停 - 放大 - 暂停 - 缩小
div.slideDown(2000)
.delay(1000)
.animate({
width: '256px',
height: '256px'
}, 2000)
.delay(1000)
.animate({
width: '128px',
height: '128px'
}, 2000);
}
此外,jQuery也没有实现对background-color
的动画效果,用animate()
设置background-color
也没有效果。这种情况下可以使用CSS3的transition
实现动画效果。AJAX
jQuery在全局对象jQuery
(也就是$
)绑定了ajax()
函数,可以处理AJAX请求。ajax(url, settings)
函数需要接收一个URL和一个可选的settings
对象,常用的选项如下:
-
async:是否异步执行AJAX请求,默认为
true
,千万不要指定为false
; -
method:发送的Method,缺省为
'GET'
,可指定为'POST'
、'PUT'
等; -
contentType:发送POST请求的格式,默认值为
'application/x-www-form-urlencoded; charset=UTF-8'
,也可以指定为text/plain
、application/json
; -
data:发送的数据,可以是字符串、数组或object。如果是GET请求,data将被转换成query附加到URL上,如果是POST请求,根据contentType把data序列化成合适的格式;
-
headers:发送的额外的HTTP头,必须是一个object;
-
dataType:接收的数据格式,可以指定为
'html'
、'xml'
、'json'
、'text'
等,缺省情况下根据响应的Content-Type
猜测。
var jqxhr = $.ajax('/api/categories', {
dataType: 'json'
});
// 请求已经发送了
jQuery的jqXHR对象类似一个Promise对象,我们可以用链式写法来处理各种回调:'use strict';
function ajaxLog(s) {
var txt = $('#test-response-text');
txt.val(txt.val() + '\n' + s);
}
$('#test-response-text').val('');
var jqxhr = $.ajax('/api/categories', {
dataType: 'json'
}).done(function (data) {
ajaxLog('成功, 收到的数据: ' + JSON.stringify(data));
}).fail(function (xhr, status) {
ajaxLog('失败: ' + xhr.status + ', 原因: ' + status);
}).always(function () {
ajaxLog('请求完成: 无论成功或失败都会调用');
});
get
对常用的AJAX操作,jQuery提供了一些辅助方法。由于GET请求最常见,所以jQuery提供了get()
方法,可以这么写:
var jqxhr = $.get('/path/to/resource', {
name: 'Bob Lee',
check: 1
});
第二个参数如果是object,jQuery自动把它变成query string然后加到URL后面,实际的URL是:
/path/to/resource?name=Bob%20Lee&check=1
这样我们就不用关心如何用URL编码并构造一个query string了。
post
post()
和get()
类似,但是传入的第二个参数默认被序列化为application/x-www-form-urlencoded
:
var jqxhr = $.post('/path/to/resource', {
name: 'Bob Lee',
check: 1
});
实际构造的数据name=Bob%20Lee&check=1
作为POST的body被发送。
getJSON
由于JSON用得越来越普遍,所以jQuery也提供了getJSON()
方法来快速通过GET获取一个JSON对象:
var jqxhr = $.getJSON('/path/to/resource', {
name: 'Bob Lee',
check: 1
}).done(function (data) {
// data已经被解析为JSON对象了
});
underscore
map/filter
Array
的map()
与filter()
类似,但是underscore的map()
和filter()
可以作用于Object。当作用于Object时,传入的函数为function (value, key)
,第一个参数接收value,第二个参数接收key:_.every()
函数返回true
,当集合的至少一个元素满足条件时,_.some()
函数返回true
:'use strict';
// 所有元素都大于0?
_.every([1, 4, 7, -3, -9], (x) => x > 0); // false
// 至少一个元素大于0?
_.some([1, 4, 7, -3, -9], (x) => x > 0); // true