课前说明
内容
掌握jQuery编程思想(链式编程,隐式迭代),使用jQuery进行常见网页效果开发。
目标
能够使用jQuery开发常见网页效果。
参考书
《锋利的jQuery》 《锋利的jQuery》(高清扫描版-有书签)
官方文档 或开源程序
jQuery官网
jQuery在线API
http://api.jquery.com/api/ (xml文件。)做个小程序,解析xml文件。
jQuery UI
常见的JavaScript框架库
什么是JavaScript框架库?
•普通JavaScript的缺点:每种控件的操作方式不统一,不同浏览器下有区别,要编写跨浏览器的程序非常麻烦。因此出现了很多对JavaScript的封装库。
常见的JavaScript框架库
•Prototype【‘prəutə.taip 】、YUI、Dojo【’dodʒo ,豆粥】、ExtJS、jQuery等,这些库对JavaScript进行了封装,简化了开发。这些库是对JavaScript的封装,内部都是用JavaScript实现的。(联想SQLHelper)
jQuery:
•jQuery就是JavaScript语法写的一些函数类,内部仍然是调用JavaScript实现的,所以并不是代替JavaScript的。使用jQuery的代码、编写jQuery的扩展插件等仍然需要JavaScript的技术,jQuery本身就是一堆JavaScript函数。
•jQuery是最火的JavaScript库,已经被集成到VS2010了,得到了MS的支持,MS的Ajax toolkit和jQuery结合也是最方便,jQuery的扩展插件也是非常多。
jQuery简介1
什么是jQuery?
•jQuery就是一个JavaScript函数库,没什么特别的。(开源)联想SQLHelper类
jQuery能做什么?jQuery是做什么的?
•jQuery本身就是一堆JavaScript函数,JavaScript是做什么的,jQuery也一样。毕竟jQuery只是用JavaScript编写的函数库而已,有些功能jQuery没有封装,则还需要通过自己写JavaScript来实现。
jQuery的特点?
Write Less,Do More
•很好的解决了不同浏览器的兼容问题(IE 6.0+, FF 2+, Safari 3.0+, Opera 9.0+, Chrome)
•对于不同控件具有统一的操作方式。
•体积小(几十KB)、使用简单方便(Write Less Do More)
•链式编程$("#div1").draggble().show().hide().fly() 、隐式迭代
•、插件丰富、开源、免费。
让编写JavaScript程序更简单、更强大!
jQuery简介2
jQuery的文件:
•jquery-1.4.1.js【常规的jQuery文件】
•jquery-1.4.1.min.js【经过压缩的jQuery文件,项目部署后使用】
•jquery-1.4.1-vsdoc.js【vs2008下,智能提示需要的文件】
jQuery最新版本:
•jquery-1.7.2.js
•jquery-1.7.2.min.js
开发jQuery的工具
•vs2010【推荐,将jQuery添加到页面中后,即可以显示智能提示】
•vs2008【需要vsdoc文件】
•1.安装vs2008sp1补丁
•2.安装VS90SP1-KB958502-x86补丁,下载地址见备注1.
•3.将vsdoc文件添加到页面或者将vsdoc文件与常规jQuery放在同一个目录下。【引用jQuery-1.4.1.js并jQuery-1.4.1-vsdoc.js放到同目录下,不需要在页面引用】
l注:vs2008下jQuery的智能提示依赖于vsdoc文件,而vs2010下的智能提示直接依赖于引入的jQuery文件。要想显示文档注释,必须依赖vsdoc文件。
jQuery中的顶级对象$(jQuery对象)
jQuery中最常用的对象即$对象,要想使用jQuery的方法必须通过$对象。只有将普通的Dom对象封装成jQuery对象,然后才能调用jQuery中的各种方法。
$是jQuery简写,在代码中可以使用jQuery代替$,但一般为了方便大家都直接使用$。
写注释,后续jQuery代码会越写越多,所以必要的注释一定要写。
编写简单的jQuery代码
需求:页面加载完毕后弹出“加载完毕!”。
•通过window.onload实现。
//-------------直接使用js实现-----------------------------
window.onload = function () {
alert('窗体加载完毕事件1111');
};
window.onload = function () {
alert('窗体加载完毕事件22222');
};
//上面的代码,当页面加载完毕后只会执行最后一个,因为最后一个window.onload赋值语句,会将前面的所有的设置的function(){}都覆盖掉。
//如果直接通过js动态注册事件,因为注册事件的时候是通过赋值语句设置的,所以只会应用最后一次注册的事件,会将前面注册的事件处理程序覆盖掉。
•通过jQuery的方式实现。
•$(document).ready(fn);
•$(fn); 【等价于$(document).ready(fn);】
•window.onload与$(document).ready(fn);的区别
•window.onload需要等待页面完全加载完毕才会触发,即所有Dom元素创建完毕、图片、Css等都加载完毕后才被触发。$(document).ready()只要Dom元素加载完毕即触发。这样可以提高响应速度。
•$(document).ready();可以多次注册事件处理程序,并且最终都会执行,而window.onload每次注册新的事件处理程序时都会将前面的覆盖掉。
•使用jQuery实现window.onload的效果:$(window).load(fn);
•jQuery中注册事件是load(fn)而不是onload(fn);与Dom不一样。
//----------------使用jQuery实现类似的效果----------------------
//使用jQuery注册的事件,不会被覆盖,当注册了多个事件处理程序后,当事件被触发时,会依次执行这些事件
//下面这种写法其实并不是为window.onload事件注册的处理程序,而是为jQuery的ready()事件注册的处理程序。
//jQuery的ready事件与window.onload事件的区别:
//1.window.onload需要等待页面全部加载完毕,其中包含页面中的标签所引用的其他资源。(整个页面需要全部加载完毕);
//而jQuery的ready事件,只要等待页面中所有的标签下载完毕就会被触发。所以说从用户“感觉”的角度来说,使用ready事件会让用户感觉处理速度“更快了”。
jQuery(function () {
alert('111111111');
});
$(function () {
alert('2222222222222222');
});
//----完整的写法------------
$(document).ready(function () {
alert('3333333333');
});
//document对象转成JQuery对象
jQuery(document).ready(function () {
alert('444444444');
});
$(window).load(function () {
//window对象转成JQuery对象,这种写法才等价于window.onload=function(){};
// });
jQuery中提供的两个函数
$.map(array,callback(element,index));
•对于数组array中的每个元素,调用callback()函数,最终返回一个新的数组。原数组不变。
•jQuery1.4时处理“键值对”数组有问题,但在1.7中已经没有问题了。
•案例1:将一个数组中的元素翻倍,并返回一个新数组。
var arrInt = [10, 20, 30, 40, 50, 60, 70, 80, 90];
//遍历数组中的每个元素,返回一个新的数组
//arrInt 要遍历的数组
//element 每一个元素的值
//index 该元素的索引
//ruturn 的值会放在一个新的数组里面
var arrIntNew = $.map(arrInt, function (element, index) {
return element * 2;
});
//arrIntNew 数组的内容是[20,40,60,80,100,120,140,160,180]
alert(arrIntNew);
•案例:将一个数组中索引大于3的元素的值翻倍,其余值不变,并返回一个新数组。
//请遍历数组,把索引大于3的元素翻倍,并返回一个新的数组
var arrInt = [10, 20, 30, 40, 50, 60, 70, 80, 90];
var arrNew = $.map(arrInt, function (element, index) {
if (index > 3) {
return element * 2;
} else {
return element;
}
});
$.each(array,fn)//遍历数组,return false来退出循环。
•主要用来遍历数组,不修改数组,对于普通数组或者“键值对”数组都没有问题。
•在each函数中可以直接使用this,表示当前元素的值。
var arrInt = [1, 2, 3, 4, 5, 6, 7];
$.each(arrInt, function (key, value) {
if (key == 3) {
//break;在$.each中跳出循环不能使用break;
//需要使用
return false; //跳出循环。
}
//当使用each遍历,普通的数组的时候,索引就是键,值就是值。
alert(key + ' , ' + value);
});
var p = { 'name': '张三', 'age': 18, email: 'zs@yahoo.com' };
$.each(p, function (k, v) {
alert(k + ' , ' + v);
});
jQuery中的trim()
$.trim(字符串);//去掉两端空格,调试看实现方式。
字符串.replace(/^\s+/,’’);
trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/;
var msg = ' hello ';
alert('====' + $.trim(msg) + '===========');
jQuery对象、Dom对象
Dom对象如果想调用jQuery的方法必须先转换为jQuery对象。
Dom对象
文档树中的对象都是dom对象。
jQuery对象
把Dom对象包装后就得到了jQuery对象。
如何获取Dom对象?
•var spObj=document.getElementById(‘span1’);
•spObj.innerText=‘Hello World’;//当直接使用dom对象的时候存在浏览器的兼容性问题。
//1.获取层对象
//页面上的元素对象才叫做dom对象,数组,日期对象,这些不是dom对象。
var dvObj = document.getElementById('dv1');
//当直接使用dom对象的时候存在浏览器的兼容性问题。
//为了解决浏览器的兼容性问题,所以这时可以把dom对象转换为jQuery对象,然后再操作
dvObj.innerText = 'Hello World!';
如何将Dom对象转换为jQuery对象?Dom→jQuery
•$(spObj).text();//$(Dom对象),就将Dom对象转换为了jQuery对象。
•不能通过jQuery对象调用Dom对象的方法,例如:$(spObj).innerHTML;
//Dom → jQuery
var $dvObj = $(dvObj);
//把dom对象转换为jQuery对象后,就可以调用对应的所有的jQuery对象的成员了。
$dvObj.text('你好,世界!');
//dom对象只能使用dom对象的成员,jQuery对象只能使用jQuery对象的成员。这两种对象是互相独立的。
// $dvObj.innerText = 'aaaaaaaaaaaaaaa';//错误!!!!!!!!!
如何将jQuery转换为Dom对象?jQuery→Dom
•$(spObj).get(0).innerHTML
•$(spObj)[0].innerHTML
//把jQuery对象再转换为dom对象
var domDiv = $dvObj[0];
var domDiv = $dvObj.get(0);//这两种办法都可以把jQuery对象转换为dom对象。
domDiv.innerText = 'bbbbbbbbbb';
//jQuery对象:
//可以把dom对象转换为jQuery对象
//也可以把jQuery对象转换为dom对象。
对象转换小结
dom to jQuery:
$(dom);
jQuery to dom:
var dom=$jqueryObject[0];
var dom=$jqueryObject.get(0);
如何直接通过jQuery方式获取页面上的元素?(获取后直接就是一个jQuery对象)
•$(‘#id’)、$(‘span’)、$(‘.cls’)、……
用选择器
jQuery对象的一些常用的方法
•通过jQuery对象即可调用:.text()、val()、html()、css(‘color’,’red’)、……。jQuery中大多都是方法少有属性,因为属性很难链式编程。获取值、设置值都是使用的同一个方法,有参数表示设置值,无参数表示取值。
val()
css()
text()
html()
document.getElementById('btn').onclick = function () {
//获取文本框中用户输入的内容
//转成jQuery对象
var $txtObj = $(document.getElementById('txt'));
alert($txtObj.val()); //从文本框中获取值
$txtObj.val('哈啊哈哈哈哈'); //为文本框设置值
//设置文本框的css样式
// $txtObj.css('border', '1px solid blue');//设置一个CSS属性
// $txtObj.css('float', 'right');//设置一个CSS属性
$txtObj.css({
'border': '1px solid blue',
'width': '200px',
'height': '20px',
color: 'yellow',//若是合法的变量名,可以不加引号。
'background-color': 'blue',//不合法的变量名,要加引号。
paddingLeft: '30px',
'float': 'right',//float是保留字,要加引号。
fontSize: '28px'
});//设置多个CSS属性
//设置超链接
var $alink = $(document.getElementById('a1'));
$alink.text('摆了个肚');//相当于js里的innerText
//相当于js里的innerHTML
$alink.html('<img src="images/猪放炮.gif" />');
};
问题
Array(数组)对象有没有对应的jQuery对象?
数组本身就不是Dom对象。不存在与jQuery对象之间的转换。使用jQuery语句可以直接使用数组,就像$.each()或$.map();
补充:通过document.getElementsByTagName()或者document.getElementsByName()获取的返回值是一个类似于数组的值,但不是数组,没有数组特有的方法,比如reverse()等,类似于C#中的string可以看成是一个char数组,但是其实不是,string是对char数组的封装。
parseInt()\Array这些是不需要转换的。
jQuery选择器1(完全兼容css选择器)
jQuery核心选择器Sizzle.js【http://sizzlejs.com/】
选择器:用于选取页面上的元素对象。jQuery选择器完全继承了CSS选择器的方式。(学会了css的选择器就会jQuery的选择器了)
jQuery选择器是学习jQuery的基础。
Dom中如何获取页面中的元素对象?
•document.getElementById(‘id’);
•document.getElementsByTagName(‘input’);
•document.getElementsByName(‘gender’);
jQuery中获取页面中的元素对象
•Id选择器
$(‘#id’);
$('#dv1').css({
'width': '100px',
height: '100px',
border: '1px solid blue'
});
•标签选择器
$(‘input’)【$(‘*’);选择页面上的所有元素。】
$('p').css('backgroundColor', 'red');
•类选择器
$('.x')// 选取所有应用了x类样式的那些元素
// 选取所有应用了x类样式的那些元素
$('.x').css('border', '10px solid red');
•(*)属性过滤选择器
$(‘*[name=gender]’)或$(‘[name=gender]’)
案例1:设置某个div中显示的内容,通过Id选择器$('#dv1');
$('#dv1').text('aaaaa');
案例2:为某个按钮注册单击事件,单击的时候设置页面上所有的p标签中显示文字为“我们都是P”。//隐式迭代
$(function () {
//选取按钮并注册一个单击事件
$('#btnSetText').click(function () {
//1.选取页面上所有的p元素
//隐式迭代和链式编程
$('p').text('大家都是p').css('border', '1px solid blue').css('width', '250px').mouseover(function () {
$(this).css('backgroundColor', 'yellow').siblings().css('backgroundColor', '');
});
});
html(‘val’).text(‘val’).css()链式编程,隐式迭代。
链式编程注意:$(‘div’).html(‘设置值’).val(‘设置值’);这样可以,但是$(‘div’).html().text()这样是不对的,因为获取值时返回的是获取的字符串而不是对象本身所以不能链式编程。【通过开发人员工具调试方法。】
jQuery选择器2
类样式选择器
$(function () {
$('.test').click(function () {
alert($(this).text());
});
//表示所有的应用了test类样式的元素
$('.test').css('backgroundColor', 'blue');
标签+类选择器
//所有的应用了test类样式的p元素 (标签+类选择器)
$('p.test').css('backgroundColor', 'red');
jQuery选择器3
多条件选择器(组合选择器、复合选择器)
($(“p,div,span.menuitem”),同时选择p标签、div标签和拥有menuitem样式的span标签元素。【将每个选择器匹配到的结果合并到一起】
//组合选择器
$('.test,#btn1,p,span,div').css('backgroundColor', 'yellow'); });
层次选择器
•(1)后代 选择器
$(“div li")获取div下的所有li元素(后代,子、子的子……)
//选取页面上的所有的p元素,设置背景色为红色
$('p').css('backgroundColor', 'red');
//选取所有的#dv1下的所有的p元素,背景色设置为黄色
$('#dv1 p').css('backgroundColor', 'yellow'); ;
//选取页面上的所有的div元素下的p元素设置背景色为蓝色
$('div p').css('backgroundColor', 'blue');
•(2)子元素 选择器
$(“div > li”)获取div下的直接li子元素 【必须是直接子元素】
//选取页面上的所有的span,设置文字颜色为red
$('span').css('color', 'red');
//选取body下的所有的span
$('body span').css('color', 'yellow');
//选取body下的直接子元素span
$('body > span').css('color', 'yellow');
•(3)相邻元素1 + 下一个兄弟元素
$(“.menuitem + div”)获取样式名为menuitem之后的相邻的(紧接着的)第一个div元素(不常用)等同于$(‘.menuitem’).next(‘div’);如果相邻的那个元素不是div,则不会继续向后找。
$('div + p').css('backgroundColor', 'red');// +表示的是next(),后一个兄弟
•(4)相邻元素2 ~ 后面所有的兄弟元素
$(“.menuitem ~ div”)获取样式名为menuitem之后所有的兄弟div元素,等同于$(‘. menuitem ’).nextAll(‘div’)。【nextAll(‘*’)或nextAll()表示后面的所有元素。】
$('div ~ p').css('backgroundColor', 'red'); // ~ 表示的是nextAll(),后面的所有的兄弟
//等价于下面这种写法
$('div').nextAll('span');
//表示选取div后的下一个元素,并且该元素必须是span元素。
$('div + span').css('backgroundColor', 'red');
// + 是指该元素紧邻的下一个兄弟元素,
//+ span 是指,该元素的下一个兄弟元素必须为span,才能被选中
//如果该元素下一个兄弟元素是p元素,p元素的下一个兄弟元素是span元素,那么该选择器什么都选中不了。
$(‘*’)
选取所有的元素。
注意:选择器表达式中的空格不能多不能少。易错!过滤器与表单选择器时注意
获得兄弟元素的几个方法
next()
当前元素之后的紧邻着的第一个兄弟元素(下一个)
nextAll()
当前元素之后的所有兄弟元素
$('div').next();
$('div + *');
//这两种写法等价
$('div').nextAll();
$('div ~ *');
//这两种写法等价
prev()
当前元素之前的紧邻着的兄弟元素(上一个)
prevAll()
当前元素之前的所有兄弟元素
$('div').prev('span');
//获取div的上一个兄弟元素,并且该兄弟元素必须是span
$('div').prevAll('span');
//获取div前面的所有的span兄弟.
siblings()
当前元素的所有兄弟元素
//获取当前元素的所有的兄弟元素
$('div').siblings('span');
案例1
页面上有一个ul球队列表当鼠标移动到某个li上的时候改行背景颜色变红,当点击某个li的时候,让该li之前的所有li背景色变黄,之后的所有li背景色变蓝。自己不变色。注意:nextAll()、prevAll()等方法返回值是一个元素集合,这里链式编程时要想清楚当前返回的值是什么。
$(function () {
$('#uone li').mouseover(function () {
//鼠标悬浮事件 ,$(this)将dom对象转成jQuery对象
$(this).css('backgroundColor', 'red')
.siblings('li')
.css('backgroundColor', '');
}).click(function () {
//单击事件
//有些方法是会破坏链式编程中返回的对象的,比如:next(),nextAll(),prev(),prevAll(),siblings(),无参数的:text()、val()、html()
//当链式编程的链被破坏以后可以通过end()方法修复。
$(this).prevAll().css('background-color', 'yellow')
.end().nextAll().css('backgroundColor', 'blue');
});
});
选择器小结
Id 选择器
$('#id名');
标签 选择器
$('p');
类 选择器
$('.类名');
标签+类 选择器
$('标签名.类名');
组合 选择器
$('选择器1,选择器2,选择器3,.....');
层次 选择器
后代元素 选择器
使用空格隔开
$('选择器1 选择器2');
//表示选取选择器1下的所有的选择器2。
子元素 选择器
使用 > 隔开
$('选择器1 > 选择器2');
相邻元素 选择器
后一个兄弟,使用 + 隔开
$('选择器1 + 选择器2');
//表示选择器1选取到的元素的后一个元素必须是满足选择器2的元素
后面所有兄弟,使用 ~ 隔开
$('选择器1 ~ 选择器2');
//表示选择器1选取到的元素的后面的所有的兄弟元素
next();
nextAll();
prev();
prevAll();
siblings();
attr的内部迭代
.attr( attributeName, function(index, attr) ) ,内部迭代,会将匿名函数的每个返回值设置到每个元素的attr上。
案例2
评分控件。
$(function () {
//为每个td注册一个mouseover事件
$('#t1 td').mouseover(function () {
$(this).text('★').prevAll().text('★').end().nextAll().text('☆');
}).mouseout(function () {
//当鼠标移开的时候把所有的Td都变成☆,把具有isclicked属性的Td以及之前的td变成★
$('#t1 td').text('☆');
$('#t1 td[isclicked=isclicked]').text('★').prevAll().text('★');
}).click(function () {
$(this).attr('isclicked', 'isclicked').siblings().removeAttr('isclicked'); //等价于setAttribute()
//点击某个td的时候显示分数
$('#pscore').text($(this).attr('score'));
}).attr('score', function (index) {
return (index + 1) * 10;
});
});
attribute与property
attribute:
•setAttribute()、getAttribute()、removeAttribute()
•一般用来设置自定义属性
$('*').attr('banjimingcheng', '.netheima13');
//给页面上所有的元素加上'banjimingcheng'这个属性,其值为'.netheima13'
property:
•dom_obj.id、dom_obj.value、dom_obj.type、dom_obj.style等dom对象的原生属性。或者dom_obj['id']、dom_obj['value']等写法是一样的。
使用注意:一般attribute都是获取网页上直接写的属性的值,网页上怎么写的获取的就是什么值;而通过property获取的是经过计算后得到的值,比如checked="checked"通过getAttribute("checked");获取的是"checked"字符串,而通过dom_obj.checked获取的确实true。又比如:图片的src路径问题,通过getAttribute("src")获取的是设置到网页上的src的值,而通过dom_obj.src获取的是经过计算后的完整的src路径。
在除IE的其他大多数浏览器下通过setAttribute()设置的属性是无法通过property来访问的,但是IE8下是可以的,所有有些混淆。
jQuery1.6版本后prop()相当于通过property获取,而attr()相当于通过setAttribute()或者getAttribute()
alert($('#chkBox').attr('checked'));
//attr等价于getAttribute()和setAttribute()
alert($('#chkBox').prop('checked')); //当要获取一个js dom对象的原生属性的时候,要使用prop()来获取。通过prop()获取的值,是经过计算的,不是直接在网页中看到的属性字符串。
获取自己加的属性用attr,获取原生属性用prop。
实现多选框的全选,全不选,反选
//全选
$('#btnChkAll').click(function () {
$('input[type=checkbox]').attr('checked', true);
});
//全不选
$('#btnNoneChk').click(function () {
$('input[type=checkbox]').attr('checked', false);
});
//反选
$('#btnChkReverse').click(function () {
// //通过自己遍历的方式,设置反选
// $.each($('input[type=checkbox]'), function (k, v) {
// $(v).attr('checked', !$(v).attr('checked'));
// });
//-----------------------------------------
$('input[type=checkbox]').attr('checked', function (index, attr_val) {
//alert(index + ',' + attr_val);
return !attr_val;
});
});