课程目标:
    1. html-text-css的作用
    2.html-text-css 源码解析


    html(), text(), css() 都是通过jQuery.access提供底层支持。jQuery.access是一个多功能方法,作为set和get值来使用。

    jQuery使用示例:

    1. <script>
    2. console.log($('#app').text());
    3. console.log($('#app').text("this is set"));
    4. console.log($('#app').css('color')); // 返回字符串
    5. console.log($('#app').css(['color'])); // 返回对象 如:{color: 'rgb(255, 0, 0)'}
    6. console.log($('#app').css('color', '#abcdef'));
    7. console.log($('#app').css({
    8. "color": '#abcdef',
    9. "font-size": '20px'
    10. }));
    11. </script>

    通过上面的示例可以知道:
    html函数:不穿参数,或一个字符串做为参数;
    css函数: 一个字符串为参数,或一个字符串数组,或两个字符串,或一个对象;

    在设计access的时候要充分考虑到以上的情况。

    1. jQuery.extend({
    2. access: function(elements, func, key, value) {
    3. //element可能是一个,也可能是多个
    4. var len = elements.length;
    5. var testing = key === null;
    6. var chain, cache, i = 0;
    7. var name;
    8. if(key !== null && jQuery.isPlainObject(key)) {
    9. chain = true; //要返回对象
    10. // 批量设置属性, 递归调用access
    11. for(name in key) {
    12. jQuery.access(elements, func, name, key[name]);
    13. }
    14. }
    15. if(value !== undefined) { // 需要设置chain 凭证
    16. chain = true; //要返回对象
    17. if(testing) {
    18. cache = func;
    19. func = function(key, value) {
    20. cache.call(this, value);
    21. };
    22. }
    23. for(; i < len; i++) {
    24. func.call(elements[i], key, value);
    25. }
    26. }
    27. return chain ? elements : (testing ? func.call(elements[0]) : func.call(elements[0], key));
    28. },
    29. content: function(elem, value) {
    30. var nodeType = elem.nodeType;
    31. // 1 -> element, 9 - > document, 11 -> ducument fragment (文档碎片)
    32. if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
    33. elem.textContent = value;
    34. }
    35. },
    36. text: function(elem) {
    37. var nodeType = elem.nodeType;
    38. if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
    39. return elem.textContent;
    40. }
    41. },
    42. style: function(elem, key, value) {
    43. var nodeType = elem.nodeType; // 3 -> 文本,8 -> 注释comment
    44. if (!elem || nodeType === 3 || nodeType === 8 || !elem.style) {
    45. return;
    46. }
    47. elem.style[key] = value;
    48. }
    49. });
    50. // 在text方法中,key为null,要么什么都不传,要么传一个value就可以了。text本身并不需要key,只是底层是通过access实现的,
    51. // access为了支持css方法,所以需要key,因为css离需要key参数。
    52. // jQuery.access方法的参数:access(element, callbacks, key, value)
    53. jQuery.fn.extend({
    54. text: function(value) {
    55. return jQuery.access(this, function(value) { // this -> jQuery对象
    56. //回调处理逻辑
    57. return value !== undefined ? jQuery.content(this, value) : jQuery.text(this);
    58. }, null, value);
    59. },
    60. css: function(key, value) {
    61. return jQuery.access(this, function(key, value) {
    62. //回调处理逻辑
    63. return value !== undefined ? jQuery.style(this, key, value) : getComputedStyle(this, null).getPropertyValue(key) || undefined;
    64. }, key, value);
    65. }
    66. });

    **Javascript面向对象设计

    **

    1. 什么是对象?
      ① 可以看得见,摸得着的东西;
      ② 可以理解的东西;

      ③ 可以指导思想或行动的东西;

    2. 对象的特征?
      ① 对象具有唯一的标示性,用内存地址来体现;
      ② 对象是有状态的;
      ③ 对象是有行为的;

    Note:JS对象具有高度灵活性(如:在运行状态中可以添加属性)。

    1. 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()方法只能用于对象自身的属性,不能用于继承的属性

    1. var obj = { p: 'a' };
    2. Object.getOwnPropertyDescriptor(obj, 'p')
    3. // {
    4. // value: "a",
    5. // writable: true,
    6. // enumerable: true,
    7. // configurable: true
    8. // }


    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