知己知彼,面进阿里 ——不屈小强
整理了这些作为下阶段读源码前的知识储备,同时分享给大家。共勉。
总述
jQuery 框架提供了很多方法,但大致上可以分为3 大类:
- 获取jQuery 对象的方法
- 在jQuery 对象间跳转的方法
- 获取jQuery 对象后调用的方法
获取 jQuery 对象
是怎样获取jQuery 对象。大致来说,是通过最核心的$()
方法,将页面上的元素(或者在页面上不存在的 html 片段)包装成 jQuery 对象。
$()方法
里面支持的语法又包括:
- 分别是表达式(包括类表达式.,id 表达式#,元素表达式等)
- 符号(包括后代符号space,next 符号+等)
- 过滤器(包括:过滤器和[]过滤器)
- 现在显然还有更多
通过以上组合,通过选择器 $()
可”查询“得到 jQuery 对象(或者jQuery 对象的集合)。
对象跳转
是在jQuery 对象间的跳转。也就是说,已经得到了一个jQuery 对象,但并不是想要的,那么可以通过一系列的跳转方法,比如parent()、next()、children()、find()等,或者过滤筛选的方法,比如eq、filter()、not()等,来得到最终想要操作的jQuery 对象。
用跳转和过滤方式得到的jQuery 结果,往往通过比较复杂的表达式组合,可以达到同样的目的。
比如说 $("div").eq(3)
,也可以用$("div:eq(3)")
达到同样的目的。
又比如说$("div").find("span")
,可以用$("div span")
取到同样的元素。
方法是很灵活的,要根据具体的情况来选择。根据经验来说,HTML 页面写得越规范,使用 jQuery 就越简单。
还有一种情况,在得到了jQuery()对象之后,想要判断其是否满足条件,那么可以调用 is()、hasClass()等方法,返回一个boolean 值,进行后续的判断。这类方法也可以归到这类。
方法调用
在获取准确的 jQuery 对象之后,调用其上的各种方法,来进行操作。这一步反而是比较简单的了。
后面就是对 jQuery 框架各种方法的简要介绍。
常用API
$(…);
$();
$(expression);
$(html)
$(element)
$(*)
jQuery 对象获取
jQuery.index(element);
jQuery.each(function);
/**
* 返回 jQuery 对象集合的大小
*/
jQuery.size();
/**
* 相当于size()方法
*/
jQuery.length
/**
* 获取原生 DomElement 对象的 Array,
* 即将 jQuery 对象转成 数组对象,
* 虽然 jQuery 对象也有 length 属性,且可用下标读写
* 但并非是数组对象。
*/
jQuery.get()
/**
* 获取原生 DomElement 对象
*/
jQuery.get(index)
/**
* 获取 jQuery 对象集合中的一个 jQuery 对象
*/
jQuery.eq(position)
Data 相关方法
在匹配的元素身上存值(store data), .data()
方法允许在我们以一种安全的方式附加数据到 dom 元素,不会产生循环引用和内存泄露。
jQuery.data(name)
jQuery.data(name, value)
jQuery.removeData(name)
$( "body" ).data( "foo", 52 );
$( "body" ).data( "bar", { myType: "test", count: 40 } );
$( "body" ).data( { baz: [ 1, 2, 3 ] } );
$( "body" ).data( "foo" );
$( "body" ).data();
选择器
$("table tr td");
$("#id > span");
$("label + input")
$("#prev ~ div")
基本的过滤器
$(":header");
$("tr:odd");
$("tr:even");
$(":animated");
$("div:animated");
$("tr:first");
$("tr:last");
$("input:not(:checked)");
$("td:gt(4)");
$("td:lt(4)");
$("td:eq(4)");
$("td").eq(4);
内容过滤选择器
$("div:contains(‘John‘)");
$("td:empty");
$("div:has(p)");
$("td:parent");
可见性过滤器
$("span:hidden");
$("span:visible");
关于可见性,这里需要额外说明的。在老版本的 jQuery 中 visibility:hidden;
是认为不可见的,我有证据,
Sizzle.selectors.filters.hidden = function(elem){
return "hidden" === elem.type ||
jQuery.css(elem, "display") === "none" ||
jQuery.css(elem, "visibility") === "hidden";
};
这段代码出自 jquery-1.3.1.js
,然而到近代的版本中(在1.3.2就改了)
jQuery.expr.filters.hidden = function( elem ) {
var width = elem.offsetWidth,
height = elem.offsetHeight;
return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
};
简单的说就是:如果元素占用空间了,就认为是可见的。只要不是0的都算可见的。
所以,visibility:hidden;
或者 opacity:0;
由于占有空间,它们算事“可见”的。
属性过滤器
$("div[id]");
$("input[name$=‘bc‘]");
$("input[name^=‘letter‘]");
$("input[tag*=‘man‘]");
$("input[abc=‘def‘]");
$("input[title!=‘722‘]");
$("input[id][gender$=‘man‘]");
孩子过滤器
$("ul li:nth-child(2)");
$("div span:firstChild");
$("div span:lastChild");
表单过滤器
$(":button");
$("form :checkbox");
$("input:checkbox");
$(":file");
$(":hidden");
$(":input");
$(":text");
$(":password");
$(":radio");
$("input:radio");
$(":image");
$(":reset");
$(":submit");
$("input:enabled");
$("input:disabled");
$("input:checked");
$("input:selected");
属性相关的方法
jQuery.removeAttr(name);
jQuery.attr(name);
jQuery.attr(key,value);
jQuery.attr(properties);
$("img").attr({
src: "/images/hat.gif",
title: "jQuery",
alt: "jQuery Logo"
});
jQuery.attr(key,function); // function 计算出的结果,赋给key
// 在回调函数中
function callback(index) {
}
类相关的操作
jQuery.toggleClass(class);
jQuery.toggleClass(class,switch);
$( "div.foo" ).toggleClass(function() {
if ( $( this ).parent().is( ".bar" ) ) {
return "happy";
} else {
return "sad";
}
});
jQuery.hasClass(class);
jQuery.removeClass(class);
jQueyr.addClass(class);
html相关的操作
jQuery.html();
jQuery.html(val);
文本相关的方法
jQuery.text();
jQuery.text(val);
值相关的操作
jQuery.val();
jQuery.val(val);
jQuery.val(array);
在jQuery 对象之间查找
需要弄清: 文本和节点是两回事,在 DOM 里就分开了。
jQuery.parent(expr);
$("span").parent();
$("span").parent(". class");
jQuery.parents(expr);
jQuery.children(expr);
jQuery.contents();
jQuery.prev();
jQuery.prevAll();
jQuery.next();
jQuery.nextAll();
jQuery.siblings();
jQuery.add(expr);
$("div").add("p");
jQuery.find(expr);
$("body").find("div");
jQuery.find("body div");
jQuery.filter(expr);
串联方法
jQuery.andSelf();
$("div").find("p").andSelf(); 这样结果集中包括所有的<p>和<div>。如果是$("div").find("p"),那就只有<p>,没有<div>
jQuery.end();
$("p").find("span").end();
DOM 文档操作方法
a.append(b);
$("div").append("<span>hello</span>");
a.appendTo(b);
$("<span>hello</span>").appendTo("#div");
$("span").appendTo("div");
jQuery.prepend(content);
a.prependTo(b);
jQuery.after(content); 注意是 content,在外部插入,插入到后面,比如
$("#foo").after("<span>hello</span>");
jQuery.insertAfter(selector);
$("<span>hello</span>").insertAfter("#foo");
jQuery.before(content);
jQuery.insertBefore(selector);
jQuery.wrapInner(html);
$("p").wrapInner("<span></span>");
jQuery.wrap(html);
$("p").wrap("<div></div>");
jQuery.wrapAll(html);
jQuery.replaceWith(content); 比如
$(this).replaceWith("<div>"+$(this).text()+"</div>");
jQuery.replaceAll(selector);
$("<div>hello</div>").replaceAll("p");
jQuery.empty();
$("p").empty();
jQuery.remove(expr);
$("p").remove();
jQuery.detach();
jQuery.clone([withDataAndEvents ] ));
CSS 相关方法
jQuery.css(name);
$("p").css("color")
jQuery.css(object);
$("p").css({
"color":"red",
"border":"1px red solid"
});
jQuery.css(name,value);
$("p").css("color","red");
位置计算相关方法
jQuery.scrollLeft();
jQuery.scrollTop();
jQuery.offset();
jQuery.position();
[object Object] {
left: 34.546875,
top: 11
}
这里需要额外补充:
The .offset() method allows us to retrieve the current position of an element relative to the document. Contrast this with .position(), which retrieves the current position relative to the offset parent.
简单来说就是:offset 是相对于 document,而 position 相对于父元素。
宽度和高度计算相关方法
这组方法需要结合CSS 的盒子模型来理解,margin 始终不参与计算
jQuery.height();
jQuery.innerHeight();
jQuery.outerHeight();
jQuery.width();
jQuery.innerWidth();
jQuery.outerWidth();
浏览器及特性检测
$.support,可以检测当前浏览器是否支持下列属性,返回boolean。包括boxModel、cssFloat、
opacity、tbody 等
$.browser,检测当前浏览器类型,返回一个map,其中可能的值有safari、opera、msie、mozilla
数据缓存方法
$.data(elem, name);
$.data(elem, name, value);
$.removeData(elem, name);
$.removeData(elem);
工具方法
$.isArray(obj);
$.isFunction(obj);
$.trim(str);
$.( value, array [, fromIndex ] )
$.inArray(value, array);
$.inArray(123, ["john",1,123,"f"]);
$.unique(array);
总结
最后,由于篇幅限制,把最重要的 事件绑定
和 ajax
独立出来,并且也还没写完呢,先到这里。