问题:

  1. jQuery对象和DOM对象的区别?
  2. jQuery对象如何转成DOM对象? DOM对象如何转为jQuery对象?
  3. jQuery选择器接口的使用?
    $(d),d可以是:对象,function,字符串(id,HTML元素标签等),空(创建jQuery对象);

image.png
image.png
带着以上问题去学习jQuery源码。

  1. console.log($('#box')); // 查询
  2. console.log($('<a>')); // 创建
  1. // jQuery原型上扩展属性
  2. jQuery.fn = jQuery.prototype = {
  3. jQuery: version,
  4. length: 0,
  5. selector: '',
  6. init: function(selector, context) {
  7. context = context || document;
  8. var index = 0, elem, match;
  9. if(typeof selector === 'string') { //创建DOM节点,或者查询DOM节点
  10. if(selector.charAt(0) === '<' && selector.charAt(selector.length-1) === '>' && selector.length >=3) {
  11. match = [selector];
  12. }
  13. if(match) { //创建DOM节点
  14. jQuery.merge(this, jQuery.parseHTML(selector, context));
  15. }
  16. else { // 查询DOM节点
  17. elem = document.querySelectorAll(selector);
  18. var elems = Array.prototype.slice.call(elem);
  19. this.length = elems.length;
  20. for(; index < elems.length; index++) {
  21. this[index] = elems[index];
  22. }
  23. this.context = context;
  24. this.selector = selector;
  25. }
  26. }
  27. else if(selector.nodeType) { // selector为对象,DOM节点,将DOM对象转为jQuery对象,设置length,数组[0],context属性
  28. this.length = 1;
  29. this.context = this[0] = selector;
  30. return this;
  31. }
  32. else if (toString.call(selector) === '[object Function]') {
  33. // 将传入的function加入到funtionList,待页面加载完毕,执行funtionList里function
  34. }
  35. },
  36. css: function() {
  37. console.log('style...');
  38. }
  39. };
  40. jQuery.extend({
  41. isPlainObject: function(obj) {
  42. return toString.call(obj) === "[object Object]";
  43. },
  44. isArray: function(obj) {
  45. return toString.call(obj) === "[object Array]";
  46. },
  47. // 合并数组
  48. merge: function(first, second) {
  49. var l = second.length;
  50. var i = first.length;
  51. var j = 0;
  52. if(typeof l === 'number') {
  53. for(; j<l; ) {
  54. first[i++] = second[j++];
  55. }
  56. }
  57. else {
  58. while(second[j] !== undefined) {
  59. first[i++] = second[j++];
  60. }
  61. }
  62. first.length = i;
  63. return first;
  64. },
  65. // 创建DOM元素,以数组形式返回
  66. parseHTML: function(data, context) {
  67. if(!data || typeof data !== 'string') {
  68. return null;
  69. }
  70. // 过滤标签
  71. var parse = rejectExp.exec(data);
  72. //console.log(parse);
  73. return [context.createElement(parse[1])];
  74. }
  75. });