jQuery 进阶
一、jQuery 杂项
1. 释放 $
$
表示jQuery对象,或者说它表示jQuery函数。使用jQuery必须要使用$
符号。
释放$
,也就是在使用jQuery的时候,不用$
符号。
2. 为什么要释放 $
为了避免冲突,所以要释放$
。
有些时候,可能项目中用到的js框架不止一个,其他框架有可能也用$
。
有些时候,我们自己定义一个函数,函数名就是$
。 这些情况都会和jQuery中的$
产生冲突。
3. 如何释放 $
方法一:
/* 使用jQuery中的noConflict()方法 */
var a = jQuery.noConflict();
a(function(){
a('body').css('background-color','green');
})
方法二:
/* 直接使用jQuery */
jQuery(function(){
jQuery('body').css('background-color','green');
})
方法三:
/* 使用闭包函数 */
!function($){
$(function(){
$('body').css('background-color','green');
});
}(jQuery)
二、ready 事件的简写形式
1. 原来的形式
$(document).ready(function(){
//...
})
2. 简化形式
$(function(){
//...
})
三、ready 事件与 onload 事件的区别
区别一: 执行时机不同。
ready事件在页面的dom节点加载完毕就会执行,无需下载图片等资源。
onload事件在页面完全加载完毕才会执行,需要页面中所有的资源都下载完毕才会执行。
区别二: 执行次数不同。
默认的onload事件只能执行一个。
ready事件,写几个,执行几个。
小例子:
/* 直接使用onload事件,只会执行一次 */
/*window.onload = function(){
alert(123);
}
window.onload = function(){
alert(456);
}*/
/* 使用事件监听的方法,会执行多次 */
/*window.addEventListener('load',function(){
alert(123);
})
window.addEventListener('load',function(){
alert(456);
})*/
/* jQuery中的ready事件,写几个就执行几个 */
$(function(){
alert('abc');
})
$(function(){
alert('efg');
})
四、DOM 对象与 jQuery 对象的区别
DOM对象就是通过纯JS的方式,比如document.getElement(s)By……得到的对象就是DOM对象。
jQuery对象就是通过jQuery方法 $(‘选择器’); 得到的对象。
区别一:
DOM对象能够调用DOM方法,而不能调用jQuery方法;
jQuery对象能够调用jQuery方法,而不能调用DOM方法;
注意: 通过某些手段能够使得DOM对象和jQuery对象发生交互。
区别实例:
$(function(){
//$('body').append('<input/>');
//$('body').appendChild('<input/>');
//后台输出错误信息,说明jQuery对象不能调用DOM方法。
varinput = document.createElement('input');
//调用DOM对象方法
//document.body.appendChild(input);
//调用jQuery方法
//input.appendTo(document.body);
//后台输出错误信息,说明DOM对象不能调用jQuery方法。
//通用length属性
console.log($('body').length);
})
交互实例:
$(function(){
var input = document.createElement('input');
/* 将jQuery对象转换成DOM对象,可以调用DOM方法 */
//1.下标的方式。
$('body')[0].appendChild(input);
//2.get方法
$('body').get().appendChild(input);
/* 将DOM对象转换成jQuery对象 */
//使用$()包裹
$(input).appendTo(document.body);
})
get()方法的说明:
语法:jQuery对象.get([index])
取得其中一个匹配的元素。 num表示取得第几个匹配的元素。从0开始,返回的是DOM对象,类似的有eq(index),不过eq(index)返回的是jQuery对象。
这能够让你选择一个实际的DOM 元素并且对他直接操作,而不是通过 jQuery 函数。$(this).get(0)
与$(this)[0]
等价。
五、each 与 map 遍历方法
1. each 方法
语法一:
需要遍历的对象.each(function(i, val){
//每遍历一次,执行一次该函数
//形参i,就是每次遍历时对象的下标
//形参val,就是每次遍历的dom对象
});
语法二:
$.each(需要遍历的对象, function(i, val){
//每遍历一次执行一次该函数。形参i和val和上面的语法中的一样
});
each用于遍历对象或数组,可以理解为for或for…in循环,但是比for和for…in要强大。
2. map 方法
语法一:
需要遍历的对象.map(function(val){
//每遍历一次,执行一次该函数
//形参val,就是每次遍历的dom对象
});
语法二:
$.map(需要遍历的对象, function(val){
//每遍历一次执行一次该函数。val和上面的语法中的一样
});
3. each 与 map 实例
<ul>
<li>123</li>
<li>456</li>
<li>789</li>
</ul>
/* 要求:点击li,得到对应的下标 */
$(function(){
var lis = $('li');
/* 普通的for循环遍历 */
/*for(var i=0;i<lis.length;i++){
lis[i].a = i;
lis[i].onclick = function(){
console.log(this.a);
}
}*/
/* 使用each进行遍历 */
$.each(lis,function(i,val){
/*lis.eq(i).click(function(){
console.log(i)
})*/
$(val).click(function(){
console.log(i);
})
})
/* 使用map进行遍历,遍历不出下标 */
/*$.map(lis, function (i, val) {
$(val).click(function () {
console.log(i);//报错,因为map只能遍历出元素,不能遍历出元素的下标
})
})*/
})
六、jQuery 中的事件绑定
1. 普通事件
普通事件,比如:click、mouseover、mouseenter、hover、mouseout、mouseleave、change、blur…等
语法:$('选择器').普通事件([data],fn)
1. 事件方法没有参数data,fn可用作传递事件
<form action="">
<input type="file" name="file" style="display:none;"></input>
<input type="button" value="选择文件"></input>
</form>
$(function(){
$("input[type='button']").click(function(){
/* 事件的传递 */
$("input[type='file']").click();
})
})
2. 给事件传递数据data,可以通过事件对象获取data中的属性
$(function(){
$("input[type='button']").click({name:'yaodao',age:20},function(evt){
/* 获取data中的属性 */
console.log(evt.data);
console.log(evt.data.name);
})
})
2. on 绑定事件
1.使用on绑定事件具有事件委托的作用。
实际上就是父元素绑定的属性,子元素也存在。
语法:$(父级元素).on(事件类型,子元素,处理函数);
<p>hello</p>
$(function(){
/* 给整一个文档子元素p的click事件 */
$(document).on('click','p',function(){
$('<p>我是后来的p</p>').appendTo($('body'));
})
})
实用性:给未来的元素绑定事件(事件委托)常用于给Ajax返回的数据添加事件。
2. 给一个元素绑定多个同类型(不同类型)的事件
<p>hello</p>
/* 不使用on也可以实现同样的功能 */
$(function(){
/*$('p').mouseover(function(){
console.log('mouseover');
});
$('p').click(function(){
console.log('click');
});*/
//链式操作
$('p').mouseover(function(){
console.log('mouseover');
}).click(function(){
console.log('click')
})
})
/* 使用on实现绑定不同类型的事件 */
$(function(){
/*$(document).on('mouseover','p',function(){
console.log('mouseover');
})
$(document).on('click','p',function(){
console.log('click');
});*/
//链式操作,以一个对象的形式绑定事件
$('p').on({
mouseover:function(){
console.log('mouseover');
},
click:function(){
console.log('click');
}
})
/* 当on绑定同一事件,还可以为事件添加一个标志,以用于区分 */
/*$(document).on('click:first','p',function(){
console.log('mouseover');
})
$(document).on('click:second','p',function(){
console.log('click');
});*/
})
1.7版本及之后,可使用on来完成事件委托;1.7之前的版本可以使用live或bind来完成事件委托
3. one 事件
给元素绑定的事件(不过绑定多少事件),都只执行一次。
<p>hello</p>
$(function(){
/* 写法一 */
$('p').one('click',function(){
console.log('hello');
})
/* 写法二 */
/*$(document).one('click','p',function(){
console.log('hello');
})*/
/* 绑定多事件,也只是执行一次 */
$('p').one({
mouseover:function(){
console.log('mouseover');
},
click:function(){
console.log('click');
}
})
})
4. off 取消事件
用于取消元素的某个事件。
实际开发中,这个东西很有用,有些时候是需要先取消掉一个元素的所有事件,然后在绑定你要绑定的事件,可以解决一些bug。
<p>hello</p>
$(function(){
$('p').on({
mouseover:function(){
console.log(1);
},
click:function(){
console.log(2);
}
});
/* 取消事件 */
/* 注意:如果off不填参数,表示取消掉p的所有事件绑定,所以要加上指定的事件。 */
$('p').off('mouseover').click(function(){
console.log(0);
})
})
off和on一组的,都是3.0版本后存在,3.0版本之前,可以使用unbind事件来完成事件的取消工作。
七、jQuery 中的 Ajax
1. $.get()方法
语法:
$.get(url, data, function(e){
//e就是服务器返回的数据
}, dataType);
四个参数:
-
url:请求地址。
-
data:发送给服务器的数据,字符串的形式或对象的形式。
-
fn:用于处理服务器返回的数据,形参e就是服务器返回的数据。
-
dataType:表示服务器返回数据的类型(text/json/html/script/_default)
HTML
<input type="button" value="点击发送请求"></input><span></span>
JavaScript
$(function(){
$("input[type='button']").click(function(){
$.get('01get.php',{name:'yaodao',age:20,sex:'male'},function(res){
$('span').text(res);
})
})
})
PHP(01get.php)
<?php
//接受发送过来的数据,进行保存
file_put_contents('get.txt',print_r($_GET,true));
// 响应一个数据
echo 123;
效果:
2. $.post()方法
语法:
$.post(url, data, function(e){
//e就是服务器返回的数据
}, dataType);
四个参数:
- url:请求地址。
- data:发送给服务器的数据,字符串的形式或对象的形式。
- fn:用于处理服务器返回的数据,形参e就是服务器返回的数据。
- dataType:表示服务器返回数据的类型(text/json/html/script/_default)
HTML
<input type="button" value="点击发送请求"></input><span></span>
JavaScript
$(function(){
$("input[type='button']").click(function(){
$.post('01get.php',{name:'yaodao',age:20,sex:'male'},function(res){
$('span').text(res);
},'text')
})
})
PHP(02.post.php)
<?php
//接受发送过来的数据,进行保存
file_put_contents('get.txt',print_r($_GET,true));
// 响应一个数据
echo 45678;
服务器返回JSON格式的数据:
JS代码,需要修改get或post方法的第4个参数为json,修改之后,接收到的数据,jQuery会自动将其转换为JS能够识别的数组或对象。但是php需要将数据转换成json格式的数据。
JavaScript
$(function(){
$("input[type='button']").click(function(){
$.post('01get.php',{name:'yaodao',age:20,sex:'male'},function(res){
console.log(res);
},'json')
})
})
PHP(02.post.php)
<?php
//接受发送过来的数据,进行保存
file_put_contents('post.text',print_r($_POST,true));
//响应一个数据
//echo 45678;
//返回一个json格式的数据
$arr = [
['id'=>1,'name'=>'张三'],
['id'=>2,'name'=>'李四'],
['id'=>3,'name'=>'王五'],
['id'=>4,'name'=>'老六']
];
echo json_encode($arr);
输出结果:
3. $.ajax()方法
语法:
$.ajax({
type:'get', //或者post
url:'',
data:{}, //发送给服务器的数据
dataType:'json', //服务器返回数据的类型
success:function(e){
//形参e仍然是服务器返回的数据
},
error:function(){
//ajax执行出错,在这里处理
},
async:false //表示同步请求,默认为true表示异步请求
});
HTML
<input type="button" value="点击发送请求"></input><span></span>
JavaScript
$(function(){
$("input[type='button']").click(function(){
$.ajax({
type:'post',
url:'02.post.php',
data:{name:'yaodao',age:20,sex:'male'},
dataType:'json',
success:function(res){
console.log(res);
}
});
});
});
PHP(02.post.php)
<?php
//接受发送过来的数据,进行保存
file_put_contents('post.text',print_r($_POST,true));
//响应一个数据
//echo 45678;
//返回一个json格式的数据
$arr = [
['id'=>1,'name'=>'张三'],
['id'=>2,'name'=>'李四'],
['id'=>3,'name'=>'王五'],
['id'=>4,'name'=>'老六']
];
echo json_encode($arr);
效果:
4. 搜集表单信息方法
使用方法:
$(表单).serialize();
返回一个经过编码的字符串。
$(表单).serializeArray();
返回一个JS数组。
二者收集到的数据都可以直接用于Ajax。
HTML
<form name="myform">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="pwd"><br>
性 别:
<input type="radio" name="sex" value="男" checked>男
<input type="radio" name="sex" value="女" >女<br>
爱 好:
<input type="checkbox" name="hobby[]" value="吃饭">吃饭
<input type="checkbox" name="hobby[]" value="睡觉">睡觉
<input type="checkbox" name="hobby[]" value="看书">看书<br>
图 片:<input type="file" name="pic"><br>
地 址:
<select name="address">
<option value="北京">北京</option>
<option value="广东">广东</option>
<option value="天津">天津</option>
</select>
<br>
简 介:<textarea name="introduce" cols="45" rows="3"></textarea><br>
<input type="button" value="提交" id="btn">
</form>
JavaScript
$(function(){
$("input[type='button']").click(function(){
var d = $('form').serialize();//返回一个经过编码的字符串。
console.log(d);
var d2 = $('form').serializeArray();//返回一个JS数组。
console.log(d2);
$.ajax({
type:'post',
url:'04serialize.php',
data:d,
dataType:'text',
success:function(res){
console.log(res);
}
});
});
});
PHP(04serialize.php)
<?php
file_put_contents('serialize.txt',print_r($_POST,true));
echo 123;
输出结果:
5. Ajax 提示方法
-
ajaxStart():在ajax开始之后,会执行
-
ajaxStop():在ajax结束时执行。
ps:低版本的写法是手册上的写法,高版本的jQuery写法如下:
HTML
<input type="button" value="发送请求">
<div id="loading" style="display: none;">玩命加载中...</div>
JavaScript
$(function(){
$('input').click(function(){
$.get('05ajaxStartandajaxStop.php',{}, function(e){
console.log(123);
}, 'text');
});
//发送ajax开始,给一个提示
$(document).ajaxStart(function(){
$('#loading').show();
});
$(document).ajaxStop(function(){
$('#loading').hide();
});
});
PHP(05ajaxStartandajaxStop.php)
<?php
sleep(2);//睡眠2秒
效果: