第十五章 AJAX JQuery
JQuery是另外一个非常流行的JavaScript框架,相对于Dojo来说JQuery更加的轻便,JQuery代码文件的大小为20kb,但是丝毫没有影响到JQuery的强大功能,也许在了解JQuery之后你会有更深刻的体会。并且JQuery使用了插件的体系结构,开发人员可以在JQuery的基础上利用插件的机制扩展JQuery的功能。
和JQuery详细的JavaScript框架有Prototype,虽然Prototype和script.aculo.us也可以制作出强大的功能的页面。但是我更喜欢JQuery的简介方式和强大的插件群。
JQuery官方网站: http://www.jquery.com
Prototype官方网站: http://www.prototypejs.org
script.aculo.us官方网站: http://script.aculo.us
JQuery核心只有一个文件jquery-x.x.x.x.js,其中x.x.x.x表示了文件的版本,现在最新的版本为1.1.3.1。并且为了提高jquery的下载效率,官方网站提供了一个压缩版本的文件,这个文件只有20kb。
安装jqueyr只需要将jquery-x.x.x.x.js拷贝到对应web项目的javascript脚本目录即可。
<script type="text/javascript" src="path/to/jquery.js"></script>
JQuery 核心
Onload 使用
我们有些时候需要在页面初始化完成的时候调用一些JavaScript预处理操作,例如设置某些Button不可用等,这个时候我们通常有两种选择。
第一:<body onload=”someFunction();”>
第二:window.onload = someFunction;
上述代码意义相同,都会在页面初始化完成之后执行someFunction这个预先定义的JavaScript函数。但是,页面初始化完成到底是什么含义呢?页面初始化完成意味着页面全部被浏览器显示,也就是说所有的image都加载完成。有些时候这个过程非常的常,有些时候我们可以看到有些网站的button先是可用,后来等所有页面显示之后又不可用了就是这个原因。
那么我们到底在什么时候执行someFunction是比较合适的呢?我们倾向于页面的全部document内容被加载,而不是所有内容正确显示之后别调用。
以img为例说明上述的区别,例如
<img src=”http://hostname:port/webapp/xxx.jpg” />
当上述字面内容被浏览器下载完成时,我们可以说img被加载了,当http://hostname:port/webapp/xxx.jpg指向的内容被下载并且被正确显示之后,可以说img被正确显示了。
如何使用JQuery来达到页面内容别加载就执行someFunction?
$(document).ready(someFunction);
$()是什么?
$()是JQuery的核心方法,$()方法有几种不同的调用方式,但是这几种方式都有一个共通的特点,就是通过$()方法,可以将一个普通的HTML DOM对象(p, div, body, doucment等)封装成为一个特殊的,增强了JQuery功能的JQuery对象。
说道这里大家可能会知道了JQuery其实相当于一个对象,一个封装了不同HTMLDOM对象的对象。
$(string)
凭空创建一个JQuery包装起来的HTML DOM对象,例如:
$("<div><p>Hello</p></div>").appendTo("body")
上述代码建立了一个Hello段,Hello段在一个div内部,之后将这个div追加到了doby内部。
$( elems )
讲一个已经存在的HTML DOM对象包装为JQuery对象,例如:
$(document.body).css( "background", "black" );
上述代码把body的background设置为black
$( myForm.elements ).hide()
隐藏myForm中所有的对象
$( function)
$(document).ready(function)的简写,总共有三种方法让一个function在dom初始化完成之后被调用:
$(document).ready(function)
$( function)
JQuery(function)
$( expr, context )
在上下文()中查找表达式()所只是的对象,context不存在的情况下在document上下文中查找,例如:
DOM对象: <p>one</p> <div><p>two</p></div> <p>three</p>
调用: $("div > p")
结果: <p>two</p>
$("input:radio", document.forms[0])
查找第一个form中的所有redio类型的输入框。
$("div", xml.responseXML)
查找xml.responseXML指示的XML文件内容中所有的div项。
扩展JQuery的功能
可以使用$.fn.extend( prop )来扩展JQuery提供的功能,例如,JQuery并没有提供check和uncheck方法,但是我们可以通过如下的代码扩展JQquery,使JQuery增加check和uncheck功能:
jQuery.fn.extend({
check: function() {
return this.each(function() { this.checked = true; });
},
uncheck: function() {
return this.each(function() { this.checked = false; });
}
});
之后我们可以选择一个对象来使用扩展的check和uncheck方法,例如:
$("input[@type=checkbox]").check();
$("input[@type=radio]").uncheck();
解决和其他框架的冲突
$在JQuery中有着特殊的含义,但是有些时候我们的项目已经集成了其他的框架)(例如Prototype),在其他框架中$已经被使用了,那么我们怎么消除JQuery对$指定的特殊含义呢?
我们可以使用jQuery.noConflict()方法,在调用这个方法之后,$已经不在具有我们前面说的JQuery赋予的功能,所以所有的后续代码必须使用JQuery调用,例如:
jQuery.noConflict();
// 调用JQuery的方法
jQuery("div p").hide();
// 调用其他框架的$()方法
$("content").style.display = 'none';
我们也可以指定自己喜欢的名字来替换$,例如:
var j = jQuery.noConflict();
// 调用jQuery的方法
j("div p").hide();
// 调用其他框架的 $( ) 方法
$("content").style.display = 'none';
其他常用方法
each( fn )
这对数组中的每一个对象调用fn方法。例如:
HTML DOM代码:<img/><img/>
调用方法: $("img").each(function(i){
this.src = "test" + i + ".jpg";
});
结果: <img src="test0.jpg"/><img src="test1.jpg"/>
eq( pos )
定位具体的HTML DOM对象
HTML DOM代码:<p>This is just a test.</p><p>So is this</p>
调用方法: $("p").eq(1)
结果: <p>So is this</p>
get( pos )
定位具体的HTML DOM对象(脱掉了JQuery的包装,原始的DOM对象)
HTML DOM代码:<img src="test1.jpg"/> <img src="test2.jpg"/>
调用方法: $("img").get( num )
结果: <img src="test1.jpg"/>
get()
针对所有的对象,脱掉了JQuery的包装,获取原始的DOM对象
HTML DOM代码:<img src="test1.jpg"/> <img src="test2.jpg"/>
调用方法: $("img").get()
结果: <img src="test1.jpg"/><img src="test2.jpg"/>
gt( pos )
取出pos之后的所有对象
HTML DOM代码:<img src="test1.jpg"/> <img src="test2.jpg"/>
调用方法: $("img").gt(0)
结果: <img src="test1.jpg"/>
index( subject )
找到subject在数组中对应的index,不存在时返回-1
HTML DOM代码:<div id="foobar"><b></b><span id="foo"></span></div>
调用方法: $("*").index( $('#foobar')[0] )
结果: 0
Length
返回对象数组的长度。
HTML DOM代码:<img src="test1.jpg"/> <img src="test2.jpg"/>
调用方法: $("img").length
结果: 2
lt( pos )
与gt相反
HTML DOM代码:<p>This is just a test.</p><p>So is this</p>
调用方法: $("p").lt(1)
结果: <p>This is just a test.</p>
size()
与length相同
JQuery HTML DOM遍历和选择器
JQuery的功能很强大,可以包装任何一个HTML DOM元素添加强大的功能,那么如何找到需要的元素呢?这就需要JQuery Selector来帮慢,原理上讲,JQuery Selector可以超找到HTML DOM里的任何元素
JQuery Selector主要包含三个方面的实现:CSS方式,XPath方式,和JQuery自定义的方式。
为了逐个讲解这些Selector,首先给大家一些基本的例子:
隐藏所有包含链接(a)的段(p):
$("p[a]").hide();
显示一个页面的第一个段(p):
$("p:eq(0)").show();
将所有显示(visible=true)的div隐藏:
$("div:visible").hide();
所有无须列表(ul)的项目(li):
$("ul/li")
或者 $("ul > li") */
获得所有class类型为foo,并且包含链接(a)的段:
$("p.foo[a]");
获得所有字符内容包含Register的项目(li)
$("li[a:contains('Register')]");
得到name=bar的输入项目的值:
$("input[@name=bar]").val();
获得所有被选中的button:
$("input[@type=radio][@checked]")
CSS方式
JQuery的CSS方式的Selector支持CSS1-CSS3标准。
与CSS中的实现完全一致的:
*
任何的元素
E
任何类型为E的元素
E:nth-child(n)
E元素的第n个子元素
E:first-child
E的第一个子元素
E:last-child
E的最后一个元素
E:only-child
E的唯一的子元素
E:empty
E没有子元素,也不能包含text内容
E:enabled
E类型的UI元素,并且不是disabled的
E:disabled
E类型的UI元素,并且是disabled的
E:checked
E类型的UI元素(radio或者checkbox),并且是checked的
E:selected
E类型的UI元素(option),并且是选中的(虽然CSS中没有支持,JQuery支持)
E.warning
Class = warning的元素(dot(.) 表示class)
E#myid
Id=myid的元素,最多有一个元素被选中。
E:not(s)
E类型的元素,但是与简单selector s 不匹配
E F
E类型的F类型的后代元素
E > F
E类型的F类型的子元素(F在E之内)
E + F
F类型紧跟着E类型(F在E之后,并且紧挨着)
E ~ F
F类型前面连着E类型(F在E之后,不一定紧挨着)
E,F,G
E,F,G所有类型的元素
与CSS中实现稍有不同的:
E[@foo]
包含属性foo的E类型的元素
E[@foo=bar]
包含属性foo,并且属性foo的值为bar的E类型的元素
E[@foo^=bar]
包含属性foo,并且foo的值以bar开始的E类型的元素
E[@foo$=bar]
包含属性foo,并且foo的值以bar结尾的E类型的元素
E[@foo*=bar]
包含属性foo,并且foo的值包含bar的E类型的元素
E[@foo=bar][@baz=bop]
属性foo值为bar,属性baz值为bop的E类型的元素。
XPath方式
位置路径
在HTML DOM中查找:
$("/html/body//p")
$("body//p")
$("p/../div")
在当前上下文中查找:
$("p/*", this)
$("/p//a", this)
坐标位置
子孙节点有一个子孙节点:
$("//div//p")
子孙节点有一个子节点:
$("//div/p")
$("//div ~ form")
$("//div/../p")
预言
$("//input[@checked]")
$("//a[@ref='nofollow']")
$("//div[p]")
$("//div[p/a]")
[last()] or [position()=last()] becomes :last
$("p:last")
[0] or [position()=0] becomes :eq(0) or :first
$("p:first")
$("p:eq(0)")
[position() < 5] becomes :lt(5)
$("p:lt(5)")
[position() > 2] becomes :gt(2)
$("p:gt(2)")
JQuery自定义的Selector
:even
偶数节点选择
:odd
奇数节点选择
:eq(n) and :nth(n)
第n个元素
:gt(N)
排序比N大的元素
:lt(N)
排序比N小的元素
:first
与:eq(0)相同
:last
最后一个元素
:parent
包含子元素(文本内容也算)的节点
:contains('test')
包含test文本内容的节点
:visible
所有显示的元素
:hidden
所有隐藏的内容
例如:
$("p:first").css("fontWeight","bold");
$("div:hidden").show();
$("/div:contains('test')", this).hide();
JQueyy 操作HTML属性和CSS
JQUery 事件
JQuery 动画效果
JQuery Ajax
JQuery 插件
JQuery Thickbox plugin
JQuery Form Plugin
JQuery Tab Plugin
JQuery Context Menu Plugin
JQuery Short Key Plugin
JQuery Inplace Plugin