$(document).ready()
打开一个网页,如果 HTML 没有完全加载完毕,就去操作页面中元素是不安全的,但是监测 HTML 是否加载完毕呢?jQuery 提供了一
个 $(document).ready() 方法,任何 ready 中的代码在 HTML 完全加载完成后才会被执行。
?
1 2 3 $(document).ready(function () {
console.log('ready!');
});
此外,它还有一个简写方式
?
1 2 3 $(function () {
console.log('ready!');
});
$(document).ready() 中并非只能执行匿名方法,执行一个已命名的方法也是可以的: ?
1 2 3 4 function readyFn() {
// code to run when the document is ready
}
$(document).ready(readyFn);
选择元素
jQuery 最基本的概念就是“选择一些元素,然后对它们做一些事情”。jQuery 支持大多数的 CSS3 选择器,另外还有一些非标准的选择器,详情见
https://www.wendangku.net/doc/4f16463451.html,/category/selectors/,下面是一些常见选择器的用法:
?
1 2 3 4 5 6 7 8 9 10 11 $('#myId'); // 此 ID 在页面中必须唯一
$('div.myClass'); // 如果指定了元素类型,那么性能会有所提升 $('input[name=first_name]'); // 速度有点慢,尽量避免这种用法
$('#contents ul.people li');
$('a.external:first');
$('tr:odd');
$('#myForm :input'); // 选择表单中的所有 input 类元素
$('div:visible');
$('div:gt(2)'); // 页面中除了前 3 个 DIV 之外的所有 DIV $('div:animated'); // 所有正在执行动画的 DIV
需要注意的地方
当使用 :visible 和 :hidden 这种伪选择器的时候,jQuery 实际上是去检测他们在页面中是否可见,还不是它们 css 中的 display 的值。也就是说,当一个元素在页面正的物理宽度和高度都大于 0,那么它就是可见的。但是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 jQuery.expr.filters.hidden = function ( elem ) {
var width = elem.offsetWidth, height = elem.offsetHeight,
skip = elem.nodeName.toLowerCase() === "tr";
// does the element have 0 height, 0 width,
// and it's not a
return width === 0 && height === 0 && !skip ?
// then it must be hidden
true :
// but if it has width and height
// and it's not a
width > 0 && height > 0 && !skip ?
// then it must be visible
17
18
19
20
21
22
23
24
25
26
27
28 false:
// if we get here, the element has width // and height, but it's also a
// so check its display property to
// decide whether it's hidden
jQuery.curCSS(elem, "display") === "none";
};
jQuery.expr.filters.visible = function( elem ) {
return!jQuery.expr.filters.hidden( elem );
};
选择器结果集中是否包含有元素
执行了一个选择器之后,如何判断选择器是否选择到了元素,可能会想当然的写下:
?
1 i f($('div.foo')) { ... }
其实这样写是不对的,因为不管选择器是否选择到元素,它都会返回一个对象,对象的布尔值肯定为true,所以,所以此方法是行不通的。其实选择器返回对象中有一个length属性,通过这个属性,可以确定选择器中到底有几个元素,如果里面一个元素都没选择到,那么返回0-false,如果选择到了元素,返回元素的实际数目-true。
?
1 i f($('div.foo').length) { ... }
给选择器做个缓存
每做一次选择器,jQuery 都要执行很多代码,如果你需要多次使用相同的一个选择器,最好给选择器做个缓存,以避免重复执行选择器。
?
1 v ar $divs = $('div');
注意,此段代码中用作缓存变量的变量名以 $ 开头,这个美元符号在 JavaScript 中仅仅是一个普通的字符,没有其它特殊意义,这里使用 $ 开头,也仅仅是一个约定俗成的习惯,并非强制要求。
一旦选择器被缓存到变量中,就可以在变量中调用 jQuery 的方法了,跟调用选择器没什么两样。
另外还需要注意的是,选择器只能选择页面当前中的元素,如果在执行了选择器后又往页面中添加元素,那么后天加的元素并没有包含在之前的选择器中,除非往页面中添加元素后再次执行选择器。
带有过滤功能的选择器
有时候执行一个选择器之后,并非结果集中的所有元素都是我们想要的,那么就需要对结果集再进行一次过滤: ?
1 2 3 4 5 $('div.foo').has('p'); // 所有包含有
的 div.foo
$('h1').not('.bar'); // 没有被标记 bar 这个类的 h1 元素 $('ul li').filter('.current'); // 带有类 current 的无序列表
$('ul li').first(); // 无序列表中的第一个元素
$('ul li').eq(5); // 第六个
选择表单元素
jQuery 提供了一些伪选择器来选择表单元素,非常有用。
:button 选择按钮
:checkbox 选择多选框
:checked 选择被选中的表单元素
:disabled 选择被禁用的表单元素
:enabled 选择被启用的表单元素
:file 选择 type="file" 的表单元素
:image 选择 type="image" 的表单元素
?
1 $('#myForm :input'); // 选择所有可输入的表单元素
如何使用选择器
执行了选择器之后,就可以调用选择器中的方法了。这些方法分为两类:getter 和 setter ,getter 返回结果集中第一个元素的属性,setter 可以设置结果集中所有元素的属性。
链式操作
jQuery 选择器中的大多数方法都会返回的都是 jQuery 对象本身,所以在调用一个方法后,可以继续在这个方法上继续调用其它方法,犹如连招一般: ?
1 $('#content').find('h3').eq(2).html('new text for the third h3!'); 对于链式操作而言,保持代码的可读性很重要: ?
1 2 $('#content')
.find('h3')
3 4 .eq(2)
.html('new text for the third h3!');
如果再链式操作中,选择器中的元素有所变化,那么可以用 $.fn.end 方法返回到最初的结果集: ?
1 2 3 4 5 6 7 $('#content')
.find('h3')
.eq(2) .html('new text for the third h3!')
.end() // 返回最初的结果集
.eq(0)
.html('new text for the first h3!');
jQuery 对有些方法进行了“重载”,所有对某元素赋值或取值的时候所用的方法名是一样的,只是参数列表不同。当用 jQuery 方法对元素赋值的时候,它称为 setter ,取值的时候称为 getter 。setter 会对选择器中的所有所有元素赋值,getter 只取得选择器中第一个元素的值。
?
1 2 $('h1').html('hello world'); // setter
var str = $('h1').html(); // getter
setter 返回的是 jQuery 对象,可以继续在这个对象上调用 jQuery 方法(链式操作),getter 仅放回我们想要的值,返回值不是 jQuery 对象,所以不能继续链式操作了。
jQuery 操作 CSS
jQuery 可以很方便的设置或取得元素的 CSS 属性。
CSS 属性如果要想在 JavaScript 中使用,多要转换成骆驼命名法(camel cased ),例如 CSS 中的 font-size 属性,在 JavaScript 中对应的是 fontSize ,但是 jQuery 的 $.fn.css 方法对此做了特殊处理,无论使用哪种写法都可以。
例如: ?
1 2 3 4 5 var strsize1 = $('h1').css('fontSize'); // 返回 "19px"
var strsize2 = $('h1').css('font-size'); // 同上
$('h1').css('fontSize', '100px'); // 给单个属性赋值 $('h1').css({ 'fontSize' : '100px', 'color' : 'red' }); // 给多个属性赋值 上面可以看到,一次性给多个属性赋值的时候,实际上传入的是一个对象,这个对象中包含了一些可以表示 CSS 属性的键-值对,在 jQuery 的很多 setter 方法中都有类似用法。
jQuery 操作元素的 class 属性
作为一个 getter ,$.fn.css 确实很好用,但是应该尽量避免将其作为 setter 使用,因为一般不建议在 JavaScript 代码中包含太多的样式代码。比较靠谱的方法是把样式规则单独分开写成类(class ),然后用 JavaScript 将类应用到元素上即可:
?
1 2 3 4 5 6 var $h1 = $('h1');
$h1.addClass('big');
$h1.removeClass('big');
$h1.toggleClass('big');
7 i f ($h1.hasClass('big')) { ... }
尺寸
jQuery 中有很多方法可以用来获取或者修改元素的尺寸或者位置信息。 ?
1 2 3 4 5 6 7 8 9 $('h1').width('50px'); // 设置所有 h1 元素的宽度
$('h1').width(); // 得到第一个 h1 元素的宽度
$('h1').height('50px'); // 设置所有 h1 元素的高度
$('h1').height(); // 得到第一个 h1 元素的高度
$('h1').position(); // 返回第一个 h1 元素
// 的位置信息,此返回值是一个对象 // 此位置是相对其父元素的位置的偏移量
这里只是对 jQuery 操纵元素大小及位置信息的简单举例,详情见
https://www.wendangku.net/doc/4f16463451.html,/category/dimensions/
元素属性
元素的属性中可以包含很多有用的信息,所以如何设置或得到属性中的值,就显得非常重要。
jQuery 的 $.fn.attr 方法可以作为 setter 和 getter 使用,用来设置或获取属性的值。和$.fn.css 用法类似,$.fn.attr 既可一次性接受单个属性,也可以接受多个属性(对象) :
?
1 2 $('a').attr('href', 'allMyHrefsAreTheSameNow.html');
$('a').attr({
3 4 5 'title' : 'all titles are the same too!',
'href' : 'somethingNew.html'
});
上面代码中写对象的时候写成多行了,更具可读性。
?
1 $('a').attr('href'); // 返回选择其中第一个超链接的链接地址
一旦选择器的结果集中有元素了,就可以这些元素为基准点遍历其它元素了。 关于 jQuery 遍历元素的方法,详
见 https://www.wendangku.net/doc/4f16463451.html,/category/traversing/
如: ?
1 2 3 4 5 $('h1').next('p');
$('div:visible').parent();
$('input[name=first_name]').closest('form');
$('#myList').children();
$('li.selected').siblings();
还可以用 $.fn.each 方法,对结果集中的元素一个一个处理: ?
1 2 3 4 5 6 7 $('#myList li').each(function (idx, el) {
console.log(
'Element ' + idx +
'has the following html: ' +
$(el).html()
);
});
移动、复制、删除元素
如果要移动一个元素的位置: ?
1 2 3 4 5 // 把第一个列表移至最后 var $li = $('#myList li:first').appendTo('#myList');
// 另外一种方法,也能达到同样效果
$('#myList').append($('#myList li:first'));
复制一个元素
? 1 2 // 把第一个 li 做一份拷贝,然后放置列表的最后
$('#myList li:first').clone().appendTo('#myList');
如果复制元素的时候,想把元素的属性和事件等信息也一起复制了的话,调用 $.fn.clone 的时候给个参数 true 就 OK 了。
再说删除元素,jQuery 中各有两种方法可以删除元素:$.fn.remove 和 $.fn.detach ,这两个方法都可以从页面中删除元素,并且这两种方法的返回值都是被删除的元素,区别是$.fn.remove 的返回的元素中的不再包含元素的一些附属信息,如 id 和 class 等信息,也不包括元素上绑定的事件。$.fn.detach 则不同,将被删除元素中的附属信息和事件也一并保存了下来,具体是用哪种,要看实际需求了。
创建新元素
jQuery 可以很快捷的换件新元素:
?
1 2 3 $('
这是一个新段落
');$('
4 5 6 7 8 $('', { html : '这是一个 新 超链接',
'class' : 'new',
href : 'foo.html'
}); 注意上面传入的 JavaScript 对象,里面的第二个属性 class 被加了引号,因为 class 是 JavaScript 的保留字,html 和 href 不是,所以不需要加引号。 创建新元素后,新元素并不会自动加入到页面中。加入页面中的话,可以用下面的方法: ?
1 2 3 4 5 var $myNewElement = $('
New element
');$myNewElement.appendTo('#content');
$myNewElement.insertAfter('ul:last'); // 此操作会把 p 元素从 #content 中移除
$('ul').last().after($myNewElement.clone()); // 当然也可以克隆一个出来,现在 #content 中有两个 p 了哦
严格来说,不是一定要将新创建的元素保存在一个变量中,可以在创建后直接加入页面内。但是很多时候新创建的元素都要被多次使用,所以要缓存在一个变量中,这样不用重复去创建它了。
你甚至可以在向页面添加元素时创建它,但是这种情况下无法获得新创建元素的引用:
?
1 $('ul').append('
往页面中添加新元素非常简单,但是如果需要向页面新加很多很多个元素的话,可能会有性能问题。因为每次向页面中添加元素,整个页面的 HTML 都要作为字符串参与拼接,这是非常耗费性能的。这种情况下,通常有以下处理方法: ?
1 2 3 4 5 6 7 var myItems = [], $myList = $('#myList');
for (var i=0; i<100; i++) {
myItems.push('
}
$myList.append(myItems.join(''));
《jQuery前端开发实战教程》试卷 得分 单选题(每题2分,共计30分) 1.页面中存在可见元素div,代码“if( $("div").show().is(:animated) ){ $("div").hide(1000); }” 的执行效果是() A、元素以动画效果隐藏 B、元素没有任何变化 C、元素无动画效果隐藏 D、元素先以动画效果隐藏,再无动画形式显示 2.关于代码“$.fn.test = function() { };”,下列说法错误的是() A、test方法可以被jQuery对象调用 B、test方法被jQuery对象调用时,this指向调用该方法的jQuery对象 C、在test方法中可以书写代码“return this”来实现链式编程 D、$.fn是jQuery原型对象jQuery.prototype的简写3.jQuery Mobile选择菜单中,当选择菜单中含有多个类别时,可添加()元素,让jQuery Mobile根据此元素中label属性的文本创建含有分割项的选项。 A、label B、optgroup C、select D、option 4.在使用tree组件时,dnd属性和lines属性设置为true分别代表()含义。 A、显示横线条显示竖线条 B、显示竖线条显示横线条 C、表示可拖动表示可拖拽 D、表示可拖动表示显示竖线条 5.下列哪种方法不可以让元素设置为不可见() A、fadeIn B、fadeOut C、fadeTo D、hide 总分题型单选题多选题填空题简答题题分 得分
6.在jQuery Mobile列表视图中,可以将任意大小的图片自动缩放到()像素,展示到列表中。 A、60 B、70 C、80 D、90 7.跟jQuery相继诞生的JavaScript库还有很多,不包括() A、Prototype B、ExtJS C、YUI D、node.js 8.下面选项中this的使用说法正确的是() A、this指向当前元素 B、this可以用来绑定事件 C、this可以获取到所有元素 D、this是一种方法9.使用animate方法实现与代码$("div").fadeIn(600)相同效果的代码写法是() A、$("div").animate({"opacity":"1"}) B、$("div").animate({"opacity":"1"},"fast") C、$("div").animate({"opacity":"1"},600) D、$("div").animate({"opacity":"1"},"normal") 10.从EasyUI网站下载到的“jquery-easyui-1.5.4.2.zip”压缩包解压,保存到“chapter08\ easyui-1.5.4.2”目录中下面说法错误的是() A、locale目录是国际化资源文件包 B、plugins是插件包目录 C、jsrc是源码包目录 D、demo和demo-mobile目录都是样例,没有区别 11.在jQuery事件中,当调整浏览器窗口时触发的事件是()事件。 A、resize() B、change() C、scroll() D、select()
$的选择器部分: 凡是运用$,其返回值是一个object $选择器主要用于选择标签.基本用法是同css的选择器.但是,很让人兴奋的是,他支持常见的浏览器,而css中很多选择器是IE6所不支持的. 1.基本选择器(3种): $("标签名"),如$("p")是选取了所有的p标签节点 $("#id名"),如$("#test")是选取了id为test的标签节点 $(".class名"),如$(".test")是选取了所有class为test的标签节点 上面的$("标签名")和$(".class名")返回的都是所有满足的节点,至于进一步筛选可以添加一些函数,如eq,gt,lt 等等. 2.组选择器: 下面还是现做一个约定:把"标签名或#id名或.class名"记作mix,则mix表示一个标签名,或一个#id或一个.class. $("mix,mix,mix,..."),如:$("div,#test1,p,.test2,#test3") 3.后代选择器: $("mix mix"),当然可以是多个嵌套,但后代选择器可以是深层子代,所以$("mix mix mix ...")这种写法作用不大.例子:$("div .test"):在div标签内的所有具有test的class的后代元素(就是被div嵌套的class属性为test 的标签) 可以见DEMO。 4.子选择器: $("mix>mix"),这个放在后代选择器后面是为了和它做对比.子选择器只能选择第一代子代.不处理深层嵌套.例子: $("div>.test")
在$("div + #test")中能取到p段落节点
则不能取到 6.属性选择器: 把属性选择器不放在css选择器里面是因为jQuery中写法是不一样的.至于css中写法可以参考我之前写的一篇css的选择器一文.jQuery中是和xPath类似的写法: $("mix[@attr]"):选取所有该mix且具有attr属性的节点 $("mix[@attr=a_value"]):选取所有该mix且具有attr属性并满足属性值为a_value的节点 $("mix[@attr^=a_value_head"]):attr属性的属性值是以a_value_head开头的 $("mix[@attr$=a_value_end"]):attr属性的属性值是以a_value_end结尾的 $("mix[@attr*=a_value"]):attr属性的属性值中包含a_value 7.进一步选择器:
jQuery入门[1]-构造函数 https://www.wendangku.net/doc/4f16463451.html,/archive/2008/03/05/1091816.html jQuery优点 ?体积小(v1.2.3 15kb) ?丰富的DOM选择器(CSS1-3 + XPath) ?跨浏览器(IE6,FF,Safari,Opera) ?链式代码 ?强大的事件、样式支持 ?强大的AJAX功能 ?易于扩展,插件丰富 jQuery的构造函数接收四种类型的参数: jQuery(expression,context) jQuery(html) jQuery(elements) jQuery(fn) 第一种根据表达式(ID,DOM元素名,CSS表达式,XPath表达式)找出文档中的元素,并组装成一个jQuery对象返回。 DEMO: DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.wendangku.net/doc/4f16463451.html,/TR/xhtml1/DTD/xhtml1-transitional.dtd">