JQuery入门
任何一个完整的web页面都应该包含三层:结构(structure),样式(style),交互(behavior),每一层都有各自的解决方案,用HTML来为网页制作良好的结构,用CSS来定制网页的样式,用Javascript或者JQuery者其他的脚本语言来为网页添加交互功能和实现一些特别的动态效果。
Javascript和JQuery两者没有本质的区别,JQuery是对javascript一个轻量的库,是对javascript的扩充和封装,相比javascript,JQuery更轻松简单、灵活优雅,用简单的代码即可实现复杂的交互和效果。HeadFirst JQuery这本书中提出了一个公式,Selector(选择器) + Event(事件) + Function(函数) = Complex interaction(复杂的交互)。选择器非常重要,正是选择器将HTML元素与CSS属性和Event事件和Function函数联系在一起来实现复杂的交互。JQuery能够轻松灵活的实现复杂的交互效果,很大的一部原因是因为JQuery有非常多的选择器,而javascript只有三种原生选择器,即:getElementById(),getElementsByName(),getElementsByTagName()。本文将重点分析JQuery的选择器和一些常用的API。
基本选择器
JQuery选择器和CSS的选择器非常类似。
1, Id选择器
# 选取带有唯一的指定 id 的元素,其中id 引用 HTML 元素的 id 属性,
相同的 id 值只能在文档中使用一次。将id="one"的元素背景色设置为黑色,代码如下:
$(document).ready(function () {
$('#one').css('background', '#000');
});
2, 元素选择器
遍历HTML页面元素,选择相匹配的元素。
$(document).ready(function() {
// 遍历form下的所有元素,将字体颜色设置为红色
$('form *').css('color', '#FF0000');
});
3, 类选择器
遍历CSS类元素。
$(document).ready(function() {
//将class="cube"的元素背景色设为黑色
$('.cube').css('background', '#000');
});
4, *选择器
遍历所有元素。
$(document).ready(function () {
// 遍历form下的所有元素,将字体颜色设置为红色
$('form *').css('color', '#FF0000');
});
5, 并列选择器
用逗号隔开,并列选择器允许同时筛选不同的元素。
$(document).ready(function() {
// 将p元素和div元素的margin设为0
$('p, div').css('margin', '0');
});
基本层次选择器
1, 后代选择器
用空格隔开,靠前的元素代表父代,靠后的元素代表子类。
$(document).ready(function() {
// div元素的所包含的p元素margin设为0
$(' div p').css('margin', '0');
});
如果改为,
$(document).ready(function() {
// div元素的所包含的p元素margin设为0
$(' div .yellow p').css('margin', '0');
});
则就是div元素元素下的类为yellow元素下的p元素。可以组合使用集中基本的选择器来实现特定的选择。
2, 直系元素选择器
$(document).ready(function () {
// 选取div下的第一代span元素,将字体颜色设为红色
$('div > span').css('color', '#FF0000');
});
下面的代码,只有第一个span会变色,第二个span不属于div的一代子元素,颜色保持不变。
<div>
<span>123</span>
<p>
<span>456</span>
</p>
</div>
3, 下一个兄弟选择器
$(document).ready(function () {
// 选取class为item的下一个div兄弟元素
$('.item+ div').css('color', '#FF0000');
// 等价代码
//$('.item').next('div').css('color', '#FF0000');
});
下面的代码,只有123和789会变色
<p class="item"></p>
<div>123</div>
<div>456</div>
<span class="item"></span>
<div>789</div>
类似于下一个兄弟选择器,将符号“+”改为“~”就可以查找到其他所有的兄弟,而不是一个。
基本过滤选择器
根据过滤的条件不同有很多,如取非的,或者限制列表中的索引等。
1, 取第一个或最后一个
$(document).ready(function () {
$('span:first').css('color', '#FF0000');
$('span:last').css('color', '#FF0000');
});
下面的代码,G1(first元素)和G3(last元素)会变色
<span>G1</span>
<span>G2</span>
<span>G3</span>
2,取非
$(document).ready(function () {
$('div:not(.wrap)').css('color', '#FF0000');
});
下面的代码,G1会变色
<div>G1</div>
<div class="wrap">G2</div>
但是,请注意下面的代码:
<div>
G1
<divclass="wrap">G2</div>
</div>
当G1所在div和G2所在div是父子关系时,G1和G2都会变色。
类似的还有很多,如取偶数的或者奇数
3,取偶数或者奇数索引
$(document).ready(function () {
$('tr:even').css('background', '#EEE'); // 偶数行颜色
$('tr:odd').css('background', '#DADADA'); // 奇数行颜色
});
A、C行颜色#EEE(第一行的索引为0),B、D行颜色#DADADA
<table width="200"cellpadding="0" cellspacing="0">
<tbody>
<tr><td>A</td></tr>
<tr><td>B</td></tr>
<tr><td>C</td></tr>
<tr><td>D</td></tr>
</tbody>
</table>
基本内容过滤选择器
1, 去包含特定文本的元素
$(document).ready(function () {
// dd元素中包含"jQuery"文本的会变色
$('dd:contains("jQuery")').css('color', '#FF0000');
});
下面的代码,第一个dd会变色
<dl>
<dt>技术</dt>
<dd>jQuery, .NET, CLR</dd>
<dt>SEO</dt>
<dd>关键字排名</dd>
<dt>其他</dt>
<dd></dd>
</dl>
上面第三个dd会显示"没有内容"文本
2,has(selector)(取选择器匹配的元素)
$(document).ready(function () {
// 为包含span元素的div添加边框
$('div:has(span)').css('border', '1pxsolid #000');
});
即使span不是div的直系子元素,也会生效
<div>
<h2>
A
<span>B</span>
</h2>
</div>
属性过滤选择器
下面的代码,最后一个a标签没有title属性,所以它仍然会带下划线
<script type="text/javascript">
$(document).ready(function() {
$('a[title]').css('text-decoration', 'none');
});
</script>
<ul>
<li><a href="#" title="DOM对象和jQuery对象"class="item">DOM对象和jQuery对象</a></li>
<li><a href="#" title="jQuery选择器大全"class="item-selected">jQuery选择器大全</a></li>
<li><a href="#" title="jQuery事件大全"class="item">jQuery事件大全</a></li>
<li><a href="#" title="基于jQuery的插件开发"class="item">基于jQuery的插件开发</a></li>
<li><a href="#" title="Wordpress & jQuery"class="item">Wordpress & jQuery</a></li>
<li><a href="#" class="item">其他</a></li>
</ul>
JQuery选择函数
除了提供多种类型的选择器外,JQuery还提供了常用的选择函数。
1.$('#some-id').parent() 选择特定元素的父元素
2.$('#some-id').next() 选择特定元素最近的下一个同级元素
3.$('#some-id').siblings() 选择特定元素的所有同级元素
4.$('#some-id').find('.some-class') 选择特定元素下所有包含特定类的元素
5.$('#some-id').find('td').not(':contains("Henry")')选择特定元素下表格内容不包含Henry的所有元素
5.$('#some-id').find('td').not(':contains("Henry")').end() .end()表示回到最后一次.find()的元素处
事件
选择器是实现交互的基础,那么事件(event)则是实现交互的核心。浏览器在时刻监听(listeners),一旦有时间被触发,则事件处理函数将执行。
<script type="text/javascript">
$(#myimg).click(function(){
$('#img').fade();
});
</script>
上面几行代码就已经把整个过程阐述清楚了,id为myimg元素绑定了click事件,一旦浏览器检测到click事件,就会执行$('#img').fade()(id为img的元素在页面隐藏了)。
元素(对象)绑定了事件,触发事件,事件处理函数被执行。浏览器多种对象,每种对象又有不同的事件,总的来说有五类事件:browser events,document loading,keyboard events,mouse events,form events。
为一个对象绑定事件有两种方法,第一种方法简单方便,但是有限制,就是这种元素必须是已存在的。
$("#myElement").click( function() {
alert($(this).text());
});
第二种方法不仅可以给已存在元素绑定时间,也可以给新创建的元素绑定事件。
$("#myElement").bind('click',function() {
alert($(this).text());
});
对于绑定到某个元素的事件也可以移除,比如在点击按钮提交表单后不希望用户第二次点击出发表单提交,就可以在用户第一次点击之后移除绑定click事件。在元素上移除事件也是可以有两种方法。
第一种:将元素直接移除绑定的事件;
$("#myElement").unbind('click');
第二种:移除元素所有的绑定事件。
JQuery常用API
1.文档加载完成执行函数
$(document).ready(function(){
alert("开始了");
});
2.添加/删除CSS类
$("#some-id").addClass("NewClassName");
$("#some-id").removeClass("ClassNameToBeRemoved");
3.选择符利用了CSS和Xpath(XML Path Language)选择符的能力,以及jQuery独有的选择符
3.1常用的:
1.根据标签名:$('p') 选择文档中的所有段落
2. 根据ID:$("#some-id")
3.类:$('.some-class')
3.2使用CSS选择符:
$("#some-id > li") 选择特定id下的所有子li元素
$("#some-id li:not(.horizontal)") 伪类选择,特定id下所有没有.horizontal类的li元素
3.3使用XPath选择符:
属性选择:$("a[@title]")选择所有带title属性的链接
$("div[ol]") 选择包含一个ol元素的所有div元素
$('a[@href^="mailto:%22]') 选择所有带href属性[@href]且该属性值以mailto开头^="mailto"(^标识字符串开始,$标识字符串结尾,*表示字符串中任意位置)
$('a[@href$=".pdf"]') 选择带有href属性且该属性值以.pdf结尾的所有链接
$('a[@href*="mysite.com"]') 选择mysite.com出现在href任意位置(包含mysite.com)的所有链接
3.4JQuery自定义选择符(过滤器,从已选择的结果集中过滤出符合某一条件的所有元素),与CSS的伪类选择符相似,使用“:”开头
1.$('div.horizontal:eq(1)') 选择带有类horizontal的div集合中的第2个项
$('div:nth-child(1)') 选择作为其父元素第1个子元素的所有div
2.自定义选择符:odd和:even选择奇偶行
$('tr:odd').addClass('odd');//过滤选择结果集中的奇数元素
$('tr:even').addClass('even'); //过滤选择结果集中的偶数元素
3.自定义选择符:contains()
$('td:contains("Henry")') 选择包含Henry字符串的所有表格
3.5JQuery选择函数
1.$('#some-id').parent() 选择特定元素的父元素
2.$('#some-id').next() 选择特定元素最近的下一个同级元素
3.$('#some-id').siblings() 选择特定元素的所有同级元素
4.$('#some-id').find('.some-class') 选择特定元素下所有包含特定类的元素
5.$('#some-id').find('td').not(':contains("Henry")') 选择特定元素下表格内容不包含Henry的所有元素
5.$('#some-id').find('td').not(':contains("Henry")').end() .end()表示回到最后一次.find()的元素处
3.6访问DOM元素,使用get()方法从选择后的JQuery对象中获得,去掉JQuery的包装
var myTag= $('#some-id').get(0).tagName;
var myTag= $('#some-id')[0].tagName; //与上面的等效
4.事件(都是给某一元素绑定事件)
4.1绑定事件
$("#some-id").bind("click", function(){ })
$("#some-id").unbind("click",bindedFunctionName); //移除已绑定的事件,前提是绑定的函数有名称(不是匿名函数)
$("#some-id").click(function(){ })
4.2复合函数绑定事件
$("#some-id").toggle(function(){ } ,function(){ }); //交替执行
$(“#some-id”).toggleClass("hidden");// 添加/删除类交替进行
$("#some-id").hover(function(){ }, function(){ }); //鼠标进入元素时执行第一个函数,离开元素时执行第二个函数
$("#some-id").one("click", functionName); //只需触发一次,随后便立即解除绑定
4.3模仿用户触发某一事件
$("#some-id").trigger("click"); //触发特定元素的click事件
5.为元素添加效果
5.1读取或设置CSS样式属性
$("#some-id").css("property") //读取样式值
$('#some-id').css('property', 'value') //设置一个样式值
$('#some-id').css({property1: 'value1', property2: 'value2'}) //设置多个样式属性
5.2改变字体大小
$(document).ready({
$('#button-id').click(function(){
varcurrentSize = $('#text-id').css('fontSize'); //获取字体大小,如30px
var num= parseFloat(currentSize, 10); //将值转为浮点数,.parseFloat( , )为javascript内置函数,这里是转为10进制的浮点数
var unit= currentSize.slice(-2); //获取单位名称,如px,.slice()是javascript内置函数,获取字符串指从定位置开始的子字符串,-2表示倒数两个字符
num *=1.5;
$('text-id').css('fontSize', num + unit); //设置字体大小样式
});
});
5.3隐藏和显示
$('#some-id').show(); //无效果,会自动记录原来的display属性值(如:block,inline),再回复display值
$('#some-id').hide(); //无效果,等效于:$('#some-id').css('display','none'); 隐藏元素,不保留物理位置
大小、透明度逐渐变化的显示或隐藏
$('#some-id').show('slow'); //指定显示速度,在指定时间内元素的高、宽、不透明度逐渐增加到属性值,有:slow是0.6秒,normal是0.4秒,fast是0.2秒,或者直接填入毫秒数
$('#some-id').hide(800); //与.show()指定速度显示一样,指定时间内高、宽、不透明度逐渐减小到0
淡入淡出
$('some-id').fadeIn('slow'); //指定时间内不透明度属性值由0增加到1
$('some-id').fadeOut('slow'); //指定时间内不透明度值由1减小到0
5.4构建具有动画效果的show
主要调用.animate()方法,其有4个参数:包含样式属性及值的映射;可选的速度参数;可选的缓动类型;可选的回调函数;
1.并发显示多个效果
$('#some-id').animate({height: 'show', width: 'show', opacity: 'show'},'slow', function(){ alert('动画显示元素');});
$('div.button').animate({left:600, height:44}, 'slow'); //水平位置从0移动到600,高度由0增加到44
2.排队显示多个效果,级联多个.animate(),一个效果显示完了再显示下一个效果
$('#some-id').animate({left:600}, 'slow').animate({height: 44}, 'slow');
6DOM操作
6.1属性操作
$('#some-id').attr('property'); //获取属性
$('#some-id').attr('property','value'); //设置属性
$('#some-id').attr({'property1': 'value1', 'property2': 'value2'}); //设置多个属性
修改一个段落中所有链接,并给每个链接附上新的id号
$('div p.content a').each(function(index){
$(this).attr({
'rel':'external',
'id':'link_' + index
});
});
//********* JQuery的.each()类似一个迭代器,给其传递的参数index类似一个计数器 *********
6.2插入新元素
1.将元素插入到其他元素前面:.insertBefore()和.before()
2.将元素插入到其他元素后面:.insertAfter()和after()
3.将元素插入到其他元素内部或后面(相当于追加一个元素):appendTo()和append()
4.将元素插入到其他元素内部或前面(相当于追加一个元素):prependTo()和prepend()
6.3包装元素,将元素包装到其他元素中 .wrap();
$('#some-id').wrap('<li></li>'); // 将某一特定元素包装到li中,即在特定元素外围添加一个包围元素
6.4复制元素 .clone()
1.$('#some-id').clone().appendTo($('body'));
2.复制深度,当传入false参数时,只复制匹配上的元素,其内部的其他元素不复制
$('#some-id').clone(false)
注意:.clone()方法不会复制元素中的事件
6.5移除匹配元素中的元素,类似清空元素
$('#some-id').empty();
6.6从DOM中移除匹配的元素及其后代元素
$('#some-id').remove();