• jQuery


    jQuery 如何获取元素

    window.jQuery = function(selector) {
      const elements = document.querySelectorAll(selector);
      return {
        addClass(className) {
          for (let i = 0; i < elements.length; i++) {
            elements[i].classList.add(className);
          }
          return this;
        }
      }
    }
    

    jQuery(选择器)用于获取对应的元素

    • 但它却不返回这些元素
    • 相反,它返回一个对象,称为jQuery构造出来的对象(简称jQuery对象)
    • 这个对象可以操作对应的元素
    jQuery(.test) 返回 当前的JQuery对象
    jQuery(.test).addClass('yy') 操作:给所有.test元素加上class:yy
                                 返回:this===jQuery(.test) ----当前的JQuery对象
    jQuery(.test).addClass('yy').addClass('bb') 操作:给所有.test元素加上class:bb
                                                返回:this===jQuery(.test).addClass('yy') ----当前的JQuery对象
    

    jQuery是一个不需要加new的构造函数

    • jQuery()能构造一个对象,而且不用加new
    • jQuery不是常规意义上的构造函数,这是因为jQuery用了一些技巧(目前没必要知道)

    window.$ = window.jQuery以后用$()就行
    ④ 用$开头的名字给JQuery对象命名!const $div=jQuery(.test)易于和普通DOM标签区分!

    jQuery 的链式操作是怎样的

    window.jQuery = function(selectorOrArray) {
      let elements;
      if (typeof selectorOrArray === "string") {
        elements = document.querySelectorAll(selectorOrArray);
      } else if (selectorOrArray instanceof Array) {
        elements = selectorOrArray;
      }
      return {
        oldApi: selectorOrArray.oldApi, //给JQuery对象加一个属性,值为selectorOrArray的oldApi属性
        find(selector) {
          let array = [];
          for (let i = 0; i < elements.length; i++) {
            array = array.concat(
              Array.from(elements[i].querySelectorAll(selector))
            );
          }
          array.oldApi = this; //先把当前的jQuery对象放到即将要成为新的elements的数组中去,成为一个oldApi属性
          return jQuery(array); //在返回 新建的 数组的jQuery对象
        },
        end() {
          return this.oldApi;
        }, //this为数组的JQuery对象了,他有个oldApi属性,属性值为selectorOrArray(也就是数组)的属性oldApi
        addClass(className) {
          for (let i = 0; i < elements.length; i++) {
            elements[i].classList.add(className);
          }
          return this;
        }
      }
    }
    //返回
    api1=jQuery('.test')
    api2=jQuery('.test').find('.children')
    api2.end()//返回this的oldApi。
              //this===api2===当前的JQuery对象。
              //oldApi:selectorOrArray.oldApi=array.oldApi=(当时的this)=(当时的JQuery对象api2)
    

    jQuery 常用API

    创建

    window.jQuery = function () {  
        console.log('我是jQuery')
    
    jQuery('#xxx)返回值并不是元素,而是一个api对象
    jQuery(" #xxx').find('.red')查找#xxx里的.red元素
    jQuery('#xxx').parent()获取爸爸
    jQuery('#xxx").children()获取儿子
    jQuery(' #xxx' ).siblings()获取兄弟
    jQuery(' #xxx ).index() 获取排行老几(从0开始)
    jQuery(" #xxx' ).next()获取弟弟
    jQuery(' #xxx ).prev()获取哥哥
    jQuery(.red').each(fn)遍历并对每个元素执行fn
    jQuery('#xxx).get(index)获取elements的下标为index的元素
    
    $('<div><span> 1</span></div> ).appendTo(...)把这串HTML加入...中
    $('body')获取document.body
    $('body').append(div>l</div>) 添加小儿子
    $('body ).append('<div>1</div>)更方便
    $(' body ).prepend(div或$div)添加大儿子
    $('#test').after(div或$div)添个弟弟
    $('#test').before(div或$div)添个哥哥
    
    $div.remove()
    $div.empty()删子元素
    
    $div.text(?)读写文本内容
    $div.html(?)读写HTML内容
    $div.attr('title',?)读写属性
    $div.css({color: 'red'})读写style // $div.style更好
    $div.addClass('blue') / removeClass / hasClass
    $div.on('click', fn)
    $div.off('click, fn)
    

    使用原型优化代码,节约内存:源码

    window.$=window.jQuery = function(selectorOrArrayOrtemplat) {  //jQuery太长,用$代替
      let elements;
      if (typeof selectorOrArray === "string") {
        elements = document.querySelectorAll(selectorOrArray);
      } else if (selectorOrArray instanceof Array) {
        elements = selectorOrArray;
      }
      //加入共有属性
      const api = Object.create(jQuery.prototype); //创建个名为api的对象,这个对象的__proto__为jQuery.prototype
                                                   //相当于const api = {__proto__:jQuery.prototype}
      //加入自身属性
      /*小白写法
      api.elements = elements;
      api.oldApi = selectorOrArray.oldApi;
      */
      //大师写法:Object.assign()表示把后面这些属性一个一个的加入api对象
      Object.assign(api, {
        elements = elements,
        oldApi = selectorOrArray.oldApi
      })
      return api;
    };
    jQuery.fn = jQuery.prototype = {  //prototype太长,用fn代替
      //共有属性
      constructor: jQuery, //必须得要,这是规定
      oldApi: selectorOrArray.oldApi,
      jquery: true,
      get(index){
          return this.elements[index];
      }
      find(selector) {},
      end() {},
      addClass(className) {},
      each(fn) {},
      parent() {},
      children() {},
      siblings() {},
      index() {},
      next() {},
      prev() {}
    };
    

    设计模式

    不用new的构造函数,这个模式没有专门的名字
    $(支持多种参数),这个模式叫做重载(一个函数支持的参数多种多样)
    用闭包隐藏细节,这个模式没有专门的名字(生成一个变量一个函数去读这个变量)
    $div.text()即可读也可写,getter / setter
    $.fn``是$.prototype的别名,这叫别名
    jQuery针对不同浏览器使用不同代码,这叫适配器模式

    参考

    阮一峰
    jQuery API 中文文档

    作者:过程是风景
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    天使投资人如何评估创业公司价值
    web报表工具finereport常用函数的用法总结(数组函数)
    采用UltraISO制作U盘启动盘
    web报表工具FineReport常用函数的用法总结(报表函数)
    web报表工具FineReport使用中遇到的常见报错及解决办法(三)
    Dll的编写 在unity中加载
    Unity 实现模拟按键
    web报表工具FineReport最经常用到部分函数详解
    Unity UGUI
    带有天气预报的高大上web报表制作分享
  • 原文地址:https://www.cnblogs.com/justcho/p/13472468.html
Copyright © 2020-2023  润新知