jQuery是一个优秀的JavaScript框架,一个轻量级的JavaScript类库。jQuery的核心理念是Write less,Do more。使用jQuery可以兼容各种浏览器,方便的处理HTML、Events、动画效果等,并且方便的为网站提供AJAX交互。
jQuery发布于2006年,一经提出就吸引很多人参与到丰富这个类库的开发之中。jQuery写法的简单性、易用性大大提升了人们对它的使用。并且完备的文档说明也是其易用的一个体现。
使用jQuery时可以做到HTML页面代码和控制的分离,彻底的将控制代码放入一个单独的文件。jQuery的版本已经从1.x到了2.x,但是从2.x开始将不再支持IE6,7,8。文件的下载可以去jquery.com下载。
图 - 1
浏览器解析一个HTML文档的过程如图– 2 所示:
图- 2
浏览器读取HTML页面时,会按照节点的层级在内存中生成DOM树,如图中所示,HTML节点对应最顶层的根节点,BODY和HEAD是根节点下的节点。DIV是BODY里面的内容,所以会在BODY下面创建节点,当HTML的DOM树构建完成后,才是对这些节点的渲染,最后是用户看到的页面的展示。
就是因为这个DOM节点树的存在,所以在进行某个节点定位时就可以用层级等方式进行定位,而所有JS的操作都是先定位节点,然后操作节点。
jQuery操作的第一步一定是要先找到这个对象,也就是定位节点。这要借助于其强大的选择器,编写代码的简洁如图-3:
图– 3
为了定位一个id属性为d1的div节点,使用的选择器写法如$(“div”)或$(“#d1”),这都是定位的一种写法,这个$符号就是jQuery中最基本的符号,搭配上不同的选择器最后就会成为包装后的jQuery对象。
jQuery解决问题的第二步就是调用类库中提供的方法,比如,为了修改div中文本的字体大小,在成功定位以后通过css方法就可以实现,如图-4
图– 4
典型的jQuery编程方式就是分这两步,定位后调用。定位可以创建jQuery对象,调用方法会对jQuery对象施加动作。
jQuery对象是jQuery对底层对象的一个封装,只有创建了这个对象,才能使用类库中提供的方法。
之所以要进行对象的包装就是将浏览器的不用给隐藏了,不再需要考虑浏览器不同创建对象的方式不同这个问题。另一方面,由于大部分方法的返回值依然是jQuery对象,所以就可以直接在返回值后面再连续调用jQuery的其他方法,于是就会出现“jQuery对象.方法().方法().方法()…”这样的连缀调用方法的样式。所以jQuery对象是能够应用jQuery类库方法的基础。
DOM对象向jQuery对象的转变很容易,外面追加$和圆括号即可。
function f( ){ varobj = document.getElementById(‘d1’); //DOM -> jQuery对象 var $obj = $(obj); $obj.html(‘hello jQuery’); }
jQuery对象向DOM对象转化,通过调用get方法加参数值0即可$obj.get(0)
function f( ){ var $obj = $(‘#d1’); //jQuery对象 -> DOM varobj = $obj.get(0); obj.innerHTML = ‘hello jQuery’; }
jQuery选择器是一种类似CSS选择器的特殊说明符号,能够帮助jQuery定位到要操作的元素上,使用了选择器可以帮助HTML实现内容与行为的分离。只需要在元素上加上Id属性。
jQuery的选择器提供了很多种形式,按照定位的不同特点,将其分类如下:
每一种选择器都有其定位的方法,更多信息详见官方下载的jQuery文档。
#id也可以叫做id选择器,即利用id属性的唯一性进行定位,这是最快的定位方式,尽量使用Id选择器。
使用jQuery进行定位时注意语法的特点,是“$”符号接小括号,在小括号内以字符串的形式编写选择器的表达式。这样定位到的就是包装后的jQuery对象。
具体代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('#d1').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div class="s1">hello prototype</div> <p class="s1">hello dojo</p> <a href="javascript:;" onclick="f1();">ClickMe</a> </body> </html>
根据节点的class属性进行定位,class属性等于选择器表达式的则被返回.
代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f2(){ $('.s1').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div class="s1">hello prototype</div> <p class="s1">hello dojo</p> <a href="javascript:;" onclick="f2();">ClickMe</a> </body> </html>
依据HTML标记进行区分,满足条件的标记都会被返回。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f3(){ $('div').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div class="s1">hello prototype</div> <p class="s1">hello dojo</p> <a href="javascript:;" onclick="f3();">ClickMe</a> </body> </html>
合成选择器,即所有选择器的合集作为定位的全部元素。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f4(){ $('#d1,p').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div class="s1">hello prototype</div> <p class="s1">hello dojo</p> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
所有页面元素都会返回,这种写法很少用。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f5(){ $('*').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div class="s1">hello prototype</div> <p class="s1">hello dojo</p> <a href="javascript:;" onclick="f5();">ClickMe</a> </body> </html>
根据select1找到节点后,再去查找子节点中符合select2选择器的节点,这种写法很重要,很常用。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('#d1 div').css('font-size','80px'); } </script> </head> <body style="font-size:30px;"> <div id="d1"> <div id="d2">hello java</div> <div id="d3"> <div id="d4" style="font-size:40px;">hello c</div> </div> <div id="d5">hello red</div> <p>hello perl</p> </div> <a href="javascript:;" onclick="f1();">ClickMe</a> </body> </html>
只查找直接子节点,不查找间接子节点。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f2(){ $('#d1>div').css('font-size','80px'); } </script> </head> <body style="font-size:30px;"> <div id="d1"> <div id="d2">hello java</div> <div id="d3"> <div id="d4" style="font-size:40px;">hello c</div> </div> <div id="d5">hello red</div> <p>hello perl</p> </div> <a href="javascript:;" onclick="f2();">ClickMe</a> </body> </html>
+号表示下一个兄弟节点,代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f3(){ $('#d3+p').css('font-size','80px'); } </script> </head> <body style="font-size:30px;"> <div id="d1"> <div id="d2">hello java</div> <div id="d3"> <div id="d4" style="font-size:40px;">hello c</div> </div> <div id="d5">hello red</div> <p>hello perl</p> </div> <a href="javascript:;" onclick="f3();">ClickMe</a> </body> </html>
“~”代表下面的所有兄弟节点。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f4(){ $('#d2~div').css('font-size','80px'); } </script> </head> <body style="font-size:30px;"> <div id="d1"> <div id="d2">hello java</div> <div id="d3"> <div id="d4" style="font-size:40px;">hello c</div> </div> <div id="d5">hello red</div> <p>hello perl</p> </div> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
图– 5
基本过滤选择器包括如图-5所示,以下标作为过滤的基准,也就是所在的位置作为过滤的条件。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('table tr:first').css('background-color','#cccccc'); $('tbodytr:eq(3)').css('background-color','yellow'); } function f2(){ $('tbodytr:even') .css('background-color','#fff8dc'); $('tbodytr:odd').css( 'background-color','yellow'); } function f3(){ $('tbodytr:eq(1) td:eq(1)') .css('background-color','yellow') .css('font-size','80px'); } function f4(){ $('tbodytr:not(#tr1)') .css('background-color','yellow') } </script> </head> <body style="font-size:30px;"> <table width="60%" border="1" cellpadding="0" cellspacing="0"> <thead> <tr><td>name</td><td>age</td></tr> </thead> <tbody> <tr><td>sally</td><td>22</td></tr> <tr id="tr1"><td>eric</td><td>13</td></tr> <tr><td>kitty</td><td>22</td></tr> <tr><td>kimi</td><td>23</td></tr> </tbody> </table> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
内容过滤选择器包含如下方式,可以依据元素的内容进行过滤。代码如下所示:
图– 6
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('div:contains(回家)').css('font-size', '60px'); } function f2(){ $('div:empty').html('还不知道'); } function f3(){ $('div:parent').css('font-size', '60px'); } function f4(){ $('div:has(p)').css('font-size', '60px'); } </script> </head> <body style="font-size:30px;"> <div>什么时候回家</div> <div></div> <div> <p>买不着票了</p> </div> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
根据元素在页面中的可见属性进行过滤,主要是对hidden属性和visible属性的判断。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ //$('div:hidden').css('display','block'); $('div:hidden').show('slow'); } function f2(){ $('div:visible').hide(800); } </script> </head> <body style="font-size:30px;"> <div>hello jQuery</div> <div style="display:none;">hello java</div> <a href="javascript:;" onclick="f2();">ClickMe</a> </body> </html>
属性过滤器会对标记的属性进行判断,符合条件的元素会作为返回的对象。代码案例如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('div[id]').css('font-size','80px'); } function f2(){ $('div[id=d2]').css('font-size','80px'); } function f3(){ $('div[id!=d2]').css('font-size','80px'); } </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <div id="d2">hello dojo</div> <div>hello java</div> <a href="javascript:;" onclick="f3();">ClickMe</a> </body> </html>
子元素过滤选择器会根据子元素的位置的数值来进行筛选。格式为:nth-child(index/even/odd)。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('ulli:eq(1)').css('font-size','60px'); } function f2(){ $('ulli:nth-child(even)').css('font-size','60px'); } </script> </head> <body style="font-size:30px;"> <ul> <li>item1</li> <li>item2</li> <li>item3</li> </ul> <ul> <li>item111</li> <li>item222</li> <li>item333</li> </ul> <a href="javascript:;" onclick="f2();">ClickMe</a> </body> </html>
根据表单元素一些特有的属性进行筛选,如enabled、disabled、checked、selected属性。代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ $('#form1 input:disabled').css('border','1px dotted red'); } function f2(){ $('#form1 input:enabled').attr('disabled',true); } function f3(){ //var length = $('#form2 input:checked').length; //alert(length); alert($('#form2 input:checked').val()); } function f4(){ alert($('#form3 select option:selected').val()); } </script> </head> <body style="font-size:30px;"> <form id="form1"> username:<input name="username"/><br/> name:<input name="name" disabled="disabled"/><br/> </form> <form id="form2"> 兴趣:钓鱼<input type="checkbox" name="interest" value="fishing" checked="checked"> 做饭:<input type="checkbox" name="interest" value="cooking"> 台球:<input type="checkbox" name="interest" value="snooker"> </form> <form id="form3"> <select style="width:120px;"> <option value="math">数学</option> <option value="english" selected="selected">英语</option> <option value="computer">计算机</option> </select> </form> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
表单选择器是根据表单元素特有的元素名进行定位的一种方式,所以这些选择器包括:
图– 7
使用的规则和以上各选择器一致。$(“:input”)就会返回所有的input输入框,大多数情况下,表单选择器会和其他选择器进行配合来定位元素。
读取或修改节点的HTML内容的操作方式。与DOM对象的innerHTML的作用一致。
读取或修改节点中的文本内容,会过滤掉标记内容,与innerText的作用基本一致,但innerText在不同浏览器中写法不同,在jQuery中则使用text()方法即可。
读取或修改节点的value属性值,也就是针对表单元素中有value属性的那些元素的操作。
读取或设置修改节点的属性。这个方法会更宽泛一些,可以修改元素的任何属性。
以上对于查询的各种方式,综合代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> /* html() innerHTML text() innerText */ function f1(){ //alert($('#d1').html()); alert($('#d1').text()); } function f2(){ $('#d1').html('<p>hello dojo</p>'); } /* val() value */ function f3(){ //alert($(':text').val()); $(':text').val('kitty'); } function f4(){ //alert($('#d1').attr('id')); $('#d1').attr('style','color:red;font-style:italic;'); } </script> </head> <body style="font-size:30px;"> <div id="d1"><span>hello jQuery</span></div> username:<input name="username"/><br/> <a href="javascript:;" onclick="f4();">ClickMe</a> </body> </html>
使用$符号将HTML标记的字符串文本括起来,即创建了DOM节点,如$(html)。
大多数时候创建后的节点需要放入文档中,使用到后续的一些方法可以实现节点的插入
简写形式如$(‘body’).append(‘<div>…</div>’)
append方法会将DOM节点作为最后一个孩子节点添加进来
prepend方法将DOM节点作为第一个孩子节点添加进来
after方法将DOM节点作为下一个兄弟节点添加进来
before方法将DOM节点作为上一个兄弟节点添加进来
remove()可以移除DOM,remove(selector)可以按选择器定位后删除,empty()清空节点。
对于DOM节点的创建,插入,删除的方法的代码案例如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> function f1(){ var $obj = $('<div>听不懂说什么,但感觉很厉害的样子</div>'); $('body').append($obj); //$('body').prepend($obj); } function f2(){ $('body').append('<div>听不懂说什么,但感觉很厉害的样子</div>'); } function f3(){ //$('ul').after('<p>hello jQuery</p>'); $('ul').before('<p>hello jQuery</p>'); } </script> </head> <body style="font-size:30px;"> <a href="javascript:;" onclick="f2();">不明觉厉是什么意思?</a> <ul> <li>item1</li> <li>item2</li> <li>item3</li> </ul> <input type="button" value="ClickMe" onclick="f3();"/> </body> </html>
clone()方法和clone(true)都会实现复制,添加参数true的时候会将节点的行为也复制到新的对象之上。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> $(function(){ $('ulli:eq(2)').click(function(){ $(this).css('font-size','60px'); }); $('#a1').click(function(){ var $obj = $('ulli:eq(2)').clone(true); $('ul').append($obj); }); }); </script> </head> <body style="font-size:30px;"> <ul> <li>item1</li> <li>item2</li> <li>item3</li> </ul> <a href="javascript:;" id="a1">ClickMe</a> </body> </html>
读取属性使用attr()方法,设置属性使用attr(‘’,‘’)方法。删除属性使用removeAttribute(‘’)方法。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style> .s1{ color:red; } .s2{ font-size:80px; } </style> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> $(function(){ $('#a1').click(function(){ $('#d1').attr('style','color:red;font-size:90px;'); $('#d1').attr('class','s1'); }); }); </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <a href="javascript:;" id="a1">ClickMe</a> </body> </html>
修改对象样式的方法如下:
图– 8
案例代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style> .s1{ color:red; } .s2{ font-size:80px; } </style> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> $(function(){ $('#a1').click(function(){ $('#d1').addClass('s1'); $('#d1').removeClass('s1'); $('#d1').toggleClass('s2'); $('#d1').css('font-style','italic'); }); }); </script> </head> <body style="font-size:30px;"> <div id="d1">hello jQuery</div> <a href="javascript:;" id="a1">ClickMe</a> </body> </html>
遍历节点的方法如下图所示:
图– 9
遍历节点的案例代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="../js/jquery-1.4.3.js"></script> <script type="text/javascript"> $(function(){ $('#a1').click(function(){ //var $obj = $('#d1').children('div'); //alert($obj.length); //$obj.css('font-size','60px'); //$('#d3').next().css('font-size','60px'); //$('#d4').next('p').css('font-size','60px'); //$('#d3').prev().css('font-size','60px'); //$('#d3').siblings().css('font-size','60px'); //$('#d3').siblings('div').css('font-size','60px'); //$('#d1').find('p').css('font-size','60px'); alert($('#d3').parent().attr('id')); }); }); </script> </head> <body style="font-size:30px;"> <div id="d1"> <div id="d2">hello 1</div> <div id="d3">hello 2</div> <div id="d4">hello 3</div> <p>hello 4</p> </div> <a href="javascript:;" id="a1">ClickMe</a> </body> </html>