jQuery
一、前言
1、作用
1、消除浏览器的差异:你不需要自己写冗长的代码来针对不同的浏览器来绑定事件,编写AJAX等代码;
2、简洁的操作DOM的方法:写$('#test') 肯定比document.getElementById('test') 来得简洁;
3、轻松实现动画、修改CSS等各种操作。
2、版本
目前jQuery有1.x和2.x两个主要版本,区别在于2.x移除了对古老的IE 6、7、8的支持,因此2.x的代码更精简。选择哪个版本主要取决于你是否想支持IE 6~8。
3、使用jQuery
<head>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
...
</head>
4、$符号
- jQuery将所有的功能全部封装在一个全局变量jQuery中,而且$是变量jQuery的别名。
- $本质上就是一个函数 jQuery(selector, context),但是不一定是这个函数名,可以进行改名。
window.$;
typeof($)
如果$ 这个变量不幸地被占用了,而且还不能改,那我们就只能让jQuery 把$ 变量交出来,然后就只能使用jQuery 这个变量:
jQuery.noConflict();
$
jQuery;
二、选择器–获取DOM节点,拿到jQuery对象
1、基本选择器
- 作用:帮助我们快速定位到一个或多个DOM节点,不需要DOM中繁琐的定位和遍历。
- jQuery对象:使用jQuery定位DOM元素,返回的是一个jQuery对象。这个对象类似一个数组,每个元素都是一个引用了DOM节点的对象。
(1)按照ID进行查找
var a = dcument.getElementById('abc');
var div = $('#abc');
var divDOM = div.get(0);
var another = $(divDOM);
(2)按照tag查找
var ps = $('p');
ps.length;
(3)按照class查找
var a = $('.red');
var a = $('.red.green');
(4)按照属性查找
一个DOM节点除了id 和class 外还可以有很多属性,很多时候按属性查找会非常方便
var email = $('[name=email]');
var icons = $('[name ^= icon]')
(5)组合查找
将上面的不同的方法进行组合,从而更加精确的确定一个DOM。
var emailInput = $('input[name=email]');
var tr = $('tr.red');
(6)多项选择器
同时进行多个不同的DOM的选择
把<p>和<div>都选出来
$('p,div');
2、层级选择器 $(‘ancestor descendant’)
因为DOM的结构就是层级结构,所以我们经常要根据层级关系进行选择。首先要定位父节点,才能选择相应的子节点,这样避免了页面其他不相关的元素。
<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>
$('ul.lang li.lang-javascript');
$('div.testing li.lang-javascript)
3、子选择器 $(‘parent > child’)
与层级选择器的区别:
子选择器$('parent>child') 类似层级选择器,但是限定了层级关系必须是父子关系,就是<child> 节点必须是<parent> 节点的直属子节点。
$('ul.lang > li.lang-javascript');
$('div.testing > li.lang-javascript');
4、表单元素的特殊选择器
5、过滤器 Filter
(1) filter() 方法
var langs = $('ul.lang li');
var js = langs.filter('.lang-javascript')
(2) 伪类 + first()、 last()和 slice()
通过类似伪类的方法选择出特定位置的DOM节点。比如第一个节点,最后一个节点,序号为偶数奇数的节点。
var langs = $('ul.lang li');
var js = langs.first();
$('ul.lang li:first-child');
$('ul.lang li:nth-child(odd)');
6、查找
var ul = $('ul.lang');
var js = ul.find('.lang-javascript');
var js = $('li.lang-javascript');
var parent = js.parent();
var js = $('li.lang-javascript');
var py = js.next();
三、操作DOM–使用jQuery对象统一之前的DOM操作
回顾一下修改DOM的CSS、文本、设置HTML有多么麻烦,而且有的浏览器只有innerHTML,有的浏览器支持innerText,有了jQuery对象,不需要考虑浏览器差异了,全部统一操作!
<div id="test-div">
<ul id="test-ul">
<li class="js">JavaScript</li>
<li name="book">Java & JavaScript</li>
</ul>
</div>
1、修改文本和添加节点 – text()、html()、append()、after()
$('#test-ul li[name=book]').text();
$('#test-ul li[name=book]').html();
$('#test-ul li.js').text('python');
$('#test-ul li').text(js);
var ul = $('#test-div>ul');
ul.append('<li><span>Haskell</span></li>');
ul.append($('#scheme'));
var js = $('#test-div>ul>li:first-child');
js.after('<li><span>Haskell</span></li>');
2、删除节点
var li = $('#test-div>ul>li');
li.remove(); // 所有<li>全被删除
3、修改css --css(‘name’,‘value’)
(1) 作用于style属性
var div = $('#test-div');
div.css('color');
div.css('color', '#336699');
div.css('color', '');
(2) 作用于class属性
<style>
.highlight {
color: #dd1144;
background-color: #ffd351;
}
</style>
div.hasClass('highlight');
div.addClass('highlight');
div.removeClass('highlight');
4、显示和隐藏DOM – show()和 hide()
var a = $('a[target=_blank]');
a.hide();
a.show();
5、获取DOM节点的宽高信息
不论是节点,浏览器也可以。
$(window).width();
$(document).width()
div.weith()
6、修改DOM属性-- attr()和 removeAttr()
div.attr('name','hello');
div.removeAttr('name');
7、操作表单 – val()
/*
<input id="test-input" name="email" value="test">
<select id="test-select" name="city">
<option value="BJ" selected>Beijing</option>
<option value="SH">Shanghai</option>
<option value="SZ">Shenzhen</option>
</select>
<textarea id="test-textarea">Hello</textarea>
*/
var
input = $('#test-input'),
select = $('#test-select'),
textarea = $('#test-textarea');
input.val();
input.val('abc@example.com');
select.val();
select.val('SH');
textarea.val();
textarea.val('Hi');
四、事件
由于不同的浏览器绑定事件的代码都不太一样,所以用jQuery来写代码,就屏蔽了不同浏览器的差异,我们总是编写相同的代码。
1、事件绑定
(1) 常用简写方法
<a id="test-link" href="#0">点我试试</a>
var a = $('#test-link');
a.on('click',function(){
alert('Hello!');
});
a.click(function(){
alert('Hello!');
})
(2) 初始化DOM – ready事件
- ready:当页面被载入并且DOM树完成初始化后触发。
问题:以下代码不会达到预期,是因为JavaScript在此执行的时候,<form> 尚未载入浏览器,所以$('#testForm) 返回[] ,并没有绑定事件到任何DOM上。DOM绑定事件的代码写在了DOM节点之前。
<html>
<head>
<script>
$('#testForm').on('submit', function () {
alert('submit!');
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
解决方法:自己的初始化代码必须放到document 对象的ready 事件中,保证DOM已完成初始化
<script>
$(document).on('ready',function(){
$('#testForm').on('submit', function () {
alert('submit!');
});
});
</script>
$(function(){
});
2、事件参数
有些事件,如mousemove 和keypress ,我们需要获取鼠标位置和按键的值,否则监听这些事件就没什么意义了。所有事件都会传入Event 对象作为参数,可以从Event 对象上获取到更多的信息
$(function () {
$('#testMouseMoveDiv').mousemove(function (e) {
$('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
});
});
3、取消绑定 – off(‘click’,function)
function hello(){
alert('hello');
}
a.click(hello);
a.click(function(){
alert('hello');
});
a.off('click',hello);
4、事件触发条件 – 代码触发change()
事件的触发总是由用户操作引发的,但是,如果用JavaScript代码去改动文本框的值,将不会触发.
var input = $('#test-input');
input.val('change it!');
input.change();
五、动画
实现原理:以固定的时间间隔去改变DOM的css样式即可。
1、show / hide / toggle – 从左上角逐渐展开或收缩
虽然这两个方法一开始是用来显示和隐藏DOM元素的。但是,传入时间参数,就变成了动画。
var div = $('#test-show-hide');
div.hide(3000);
div.show('slow');
div.toggle('slow');
2、slideUp / slideDown /slideToggle – 在垂直方向逐渐展开或收缩
div.slideUp(3000);
3、fadeIn / fadeOut / fadeToggle – 淡入淡出
div.fadeOut('slow');
4、自定义动画 – animate()
传入的参数就是DOM元素最终的CSS状态和时间,还可以再传入一个函数,当动画结束时,该函数将被调用。
var div = $('#test-animate');
div.animate({
opacity: 0.25,
width: '256px',
height: '256px'
}, 3000, function () {
console.log('动画已结束');
$(this).css('opacity', '1.0').css('width', '128px').css('height', '128px');
});
5、串行动画 – 实现复杂的连续动画
div.slideDown(2000)
.delay(1000)
.animate({
width: '256px',
height: '256px'
}, 2000)
.delay(1000)
.animate({
width: '128px',
height: '128px'
}, 2000);
}
六、AJAX
jQuery的AJAX完全封装的是JavaScript的AJAX操作,从而简化相应的操作。
1、ajax(url, settings) – 通用的发送AJAX的请求
- jQuery在全局对象
jQuery (也就是$ )绑定了ajax() 函数,可以处理AJAX请求。函数接受一个服务器的地址,以及一个可选的settings 对象。 - settings对象的选项:
var jqxhr = $.ajax('/api/categories',{dataType:'json'});
用回调函数处理返回的数据和出错时的响应 – 类似Promise的链式操作
2、get()、post()
- 封装的是GET请求,当传入发送的数据data的时候,data将被转换成query附加到URL上。
- 封装的是POST请求,当传入发送的数据data的时候,根据contentType把data序列化成合适的格式。
(1)$.get(URL,callback); – 从服务器中请求数据
第二个参数是回调函数。第一个回调参数存有被请求页面的内容,第二个回调参数存有请求的状态。
$('button').click(function(){[
$.get('demo.php',function(data,status){
alert('数据' + data + '\n状态' + status);
})
]})
(2) $.post(URL,data,callback); – 向服务器提交数据。
$("button").click(function(){
$.post("/try/ajax/demo_test_post.php",
{
name:"菜鸟教程",
url:"http://www.runoob.com"
},
function(data,status){
alert("数据: \n" + data + "\n状态: " + status);
});
});
3、getJSON
通过GET获取一个JSON对象
var jqxhr = $.getJSON('/path/to/resource', {
name: 'Bob Lee',
check: 1
}).done(function (data) {
});
4、安全限制
七、编写jQuery插件
给jQuery对象绑定一个新方法是通过扩展$.fn 对象实现的.
<div id="test-highlight">
<p>如何编写<span>jQuery</span> <span>Plugin</span></p>
<p>编写<span>jQuery</span> <span>Plugin</span>,要设置<span>默认值</span>,并允许用户修改<span>默认值</span>,或者运行时传入<span>其他值</span>。</p>
</div>
编写jQuery插件:高亮
$fn.highlight = function(options){
var opts = $.extend({},$.fn.highlight.defaults,options);
this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
return this;
}
$.fn.highlight.defaults.color = '#fff';
$.fn.highlight.defaults.backgroundColor = '#000';
$('#test-highlight p:first-child span').highlight();
$('#test-highlight p:last-child span').highlight({
color: '#dd1144'
});
``
编写jQuery插件:高亮
```js
$fn.highlight = function(options){
var opts = $.extend({},$.fn.highlight.defaults,options);
this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
return this;
}
$.fn.highlight.defaults.color = '#fff';
$.fn.highlight.defaults.backgroundColor = '#000';
$('#test-highlight p:first-child span').highlight();
$('#test-highlight p:last-child span').highlight({
color: '#dd1144'
});
|