课程目标:
1. html-text-css的作用
2.html-text-css 源码解析
html(), text(), css() 都是通过jQuery.access提供底层支持。jQuery.access是一个多功能方法,作为set和get值来使用。
jQuery使用示例:
<script>console.log($('#app').text());console.log($('#app').text("this is set"));console.log($('#app').css('color')); // 返回字符串console.log($('#app').css(['color'])); // 返回对象 如:{color: 'rgb(255, 0, 0)'}console.log($('#app').css('color', '#abcdef'));console.log($('#app').css({"color": '#abcdef',"font-size": '20px'}));</script>
通过上面的示例可以知道:
html函数:不穿参数,或一个字符串做为参数;
css函数: 一个字符串为参数,或一个字符串数组,或两个字符串,或一个对象;
在设计access的时候要充分考虑到以上的情况。
jQuery.extend({access: function(elements, func, key, value) {//element可能是一个,也可能是多个var len = elements.length;var testing = key === null;var chain, cache, i = 0;var name;if(key !== null && jQuery.isPlainObject(key)) {chain = true; //要返回对象// 批量设置属性, 递归调用accessfor(name in key) {jQuery.access(elements, func, name, key[name]);}}if(value !== undefined) { // 需要设置chain 凭证chain = true; //要返回对象if(testing) {cache = func;func = function(key, value) {cache.call(this, value);};}for(; i < len; i++) {func.call(elements[i], key, value);}}return chain ? elements : (testing ? func.call(elements[0]) : func.call(elements[0], key));},content: function(elem, value) {var nodeType = elem.nodeType;// 1 -> element, 9 - > document, 11 -> ducument fragment (文档碎片)if (nodeType === 1 || nodeType === 9 || nodeType === 11) {elem.textContent = value;}},text: function(elem) {var nodeType = elem.nodeType;if (nodeType === 1 || nodeType === 9 || nodeType === 11) {return elem.textContent;}},style: function(elem, key, value) {var nodeType = elem.nodeType; // 3 -> 文本,8 -> 注释commentif (!elem || nodeType === 3 || nodeType === 8 || !elem.style) {return;}elem.style[key] = value;}});// 在text方法中,key为null,要么什么都不传,要么传一个value就可以了。text本身并不需要key,只是底层是通过access实现的,// access为了支持css方法,所以需要key,因为css离需要key参数。// jQuery.access方法的参数:access(element, callbacks, key, value)jQuery.fn.extend({text: function(value) {return jQuery.access(this, function(value) { // this -> jQuery对象//回调处理逻辑return value !== undefined ? jQuery.content(this, value) : jQuery.text(this);}, null, value);},css: function(key, value) {return jQuery.access(this, function(key, value) {//回调处理逻辑return value !== undefined ? jQuery.style(this, key, value) : getComputedStyle(this, null).getPropertyValue(key) || undefined;}, key, value);}});
**Javascript面向对象设计
**
什么是对象?
① 可以看得见,摸得着的东西;
② 可以理解的东西;③ 可以指导思想或行动的东西;
对象的特征?
① 对象具有唯一的标示性,用内存地址来体现;
② 对象是有状态的;
③ 对象是有行为的;
Note:JS对象具有高度灵活性(如:在运行状态中可以添加属性)。
- JS对象的 属性描述对象
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是属性描述对象的一个例子。
{
value: 123,
writable: false,
enumerable: true,
configurable: false,
get: undefined,
set: undefined
}
属性描述对象提供6个元属性。
(1)value:value是该属性的属性值,默认为undefined。
(2)writable:writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。
(3)enumerable:enumerable是一个布尔值,表示该属性是否可遍历,默认为true。如果设为false,会使得某些操作(比如for…in循环、Object.keys())跳过该属性。
(4)configurable:configurable是一个布尔值,表示可配置性,默认为true。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)。也就是说,configurable属性控制了属性描述对象的可写性。
(5)get:get是一个函数,表示该属性的取值函数(getter),默认为undefined。
(6)set:set是一个函数,表示该属性的存值函数(setter),默认为undefined。
Object.getOwnPropertyDescriptor()方法可以获取属性描述对象。它的第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。
注意,Object.getOwnPropertyDescriptor()方法只能用于对象自身的属性,不能用于继承的属性。
var obj = { p: 'a' };Object.getOwnPropertyDescriptor(obj, 'p')// {// value: "a",// writable: true,// enumerable: true,// configurable: true// }
Object.getOwnPropertyNames方法返回一个数组,成员是参数对象自身的全部属性的属性名,不管该属性是否可遍历。
这跟Object.keys的行为不同,Object.keys只返回对象自身的可遍历属性的全部属性名。
JS是基于原型的面向对象的语言。
Notes:
element.style: 只能获取到行内样式(内联样式)-(可读,可写);
window.getComputedStyle():可以获取外部样式表设置的样式(只读);
Node Types
文档、元素、属性以及 HTML 或 XML 文档的其他方面拥有不同的节点类型。
存在 12 种不同的节点类型,其中可能会有不同节点类型的子节点:
| 节点类型 | 描述 | 子节点 | |
|---|---|---|---|
| 1 | Element | 代表元素 | Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference |
| 2 | Attr | 代表属性 | Text, EntityReference |
| 3 | Text | 代表元素或属性中的文本内容。 | None |
| 4 | CDATASection | 代表文档中的 CDATA 部分(不会由解析器解析的文本)。 | None |
| 5 | EntityReference | 代表实体引用。 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference |
| 6 | Entity | 代表实体。 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference |
| 7 | ProcessingInstruction | 代表处理指令。 | None |
| 8 | Comment | 代表注释。 | None |
| 9 | Document | 代表整个文档(DOM 树的根节点)。 | Element, ProcessingInstruction, Comment, DocumentType |
| 10 | DocumentType | 向为文档定义的实体提供接口 | None |
| 11 | DocumentFragment | 代表轻量级的 Document 对象,能够容纳文档的某个部分 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference |
| 12 | Notation | 代表 DTD 中声明的符号。 | None |
