zoukankan      html  css  js  c++  java
  • 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 中文文档

    作者:过程是风景
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Access restriction: The type * is not accessible due to restrict,报错问题,只试过第二种,OK。
    Java读写Properties文件
    MyBatis学习4---使用MyBatis_Generator生成Dto、Dao、Mapping
    Mybatis 3+Mysql 实现批量插入
    Java访问MySQL数据库的SqlHelper类以及测试程序
    sun.net.ftp.FtpClient(java访问/操作ftp)
    java通过ftp方式读取文件,并解析入库
    Linux CPU 上下文切换
    Perl-DBI
    Perl文件句柄和文件描述符
  • 原文地址:https://www.cnblogs.com/justcho/p/13472468.html
Copyright © 2011-2022 走看看