web前端 - 精简系列三:jQuery

137 阅读3分钟

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

jQuery在线文档

jQuery选择器及链式编程

// 基本和层级选择器
      $("#id")  $(".class")  $("div")  $("div,li,span")  $("li.current")
      console.dir($('li.current'));
      $('li.current').css({
        color: 'white',
        background: 'pink',
      });

      // 层级选择器
      // 层级选择器最常用的两个分别为:后代选择器和子代选择器。
      $("ul li")   $("ul>li")
      $('ul li').css({
        background: 'blue',
      });

      // 隐式迭代 // 被选中的元素都添加了样式,默认自带循环效果。
      $('div').css('background', 'red')
      $('ul li').css('color', 'blue')

      // 筛选选择器
      // 筛选选择器,顾名思义就是在所有的选项中选择满足条件的进行筛选选择。常见如下 :
      $("li:first")  $("li:last")   $("li:eq(2)")  $("li:odd")  $("li:even")

      // 筛选方法
      // 筛选方法-选取父子元素
      $('.son').parent() // 选取父子元素
      $('.nav').find('p') // 查找该父元素nav中嵌套的p标签子元素
      $(function () {
      console.log($('.son').parent()) // w.fn.init [div.father, prevObject: w.fn.init(1)]
      $('.nav').find('p').css('color', 'blue')  //find查找该父元素nav中嵌套的p标签子元素,全部会找出来。
      })

      // 其他筛选方法
      $('ol >li').siblings('li') // 兄弟元素siblings 除了自身元素之外的所有亲兄弟
      $('ul >li').eq(4) //查找该子元素
      $('ul >li').eq(变量名) //查找该子元素
      $('ol >li').hasClass('item')//判断是否有某个类名,返回布尔值。

      // 判断是否有某个类名
      console.log($('ol >li').hasClass('item'))//true

      // 链式编程
      $(this).css('color', 'red').sibling().css('color', '');
      $('ul li').click(function () {
        $(this).css({ background: 'red' }).siblings().css('background', '');
      });

      // jQ 转 JS 两种方法:   方法1: [0]   |   方法二: .get(0)
      console.log($('ul li').text());
      console.log($('ul li')[0].innerHTML);
      console.log($('ul li').get(0).innerText);

      // 修改样式操作类
      // 作用等同于以前的 classList,可以操作类样式, 注意操作类里面的参数不要加点。
      $('.box').addClass('current'); //1. 添加类
      $('.box').removeClass('current'); //2. 移除类
      $('.box').toggleClass('current'); //3. 切换类

      // 电商商品切换
      $('ul li').click(function () {
        var index = $(this).index();
        console.log(index);
        $(this).addClass('current').siblings('li').removeClass();
        $('.container > div').eq(index).show().siblings('div').hide();
      });

jQuery-动画

      // jQuery 给我们封装了很多动画效果,最为常见的如下:
      // - 显示隐藏:show() / hide() / toggle() ;
      // - 滑入滑出:slideDown() / slideUp() / slideToggle() ;
      // - 淡入淡出:fadeIn() / fadeOut() / fadeToggle() / fadeTo() ;
      // - 自定义动画:animate() ;
      $('button')
        .eq(0)
        .click(function () {
          $('div').toggle();
        });
      $('button')
        .eq(1)
        .click(function () {
          $('div').slideToggle();
        });
      $('button')
        .eq(2)
        .click(function () {
          $('div').fadeToggle(1000);
        });

      $('.box').click(function () {
        $(this).animate({
          top: '300',
          left: 500, //如果是数字,可以不用加引号和px,但是建议加上引号和px单位。
          opactiy: 0.5, //.5不推荐,推荐写0.5
          width: 500, // backgroundColor在jquery中设置是无效的
        });
      });

jQuery 属性操作

      // 设置或获取元素固有属性值 prop()
      // 设置或获取元素自定义属性值 attr()
      $('img').prop({
        src: '../image/衣服.jpg',
        alt: '衣服',
      });
      $('a').prop({
        href: 'https://www.jd.com',
      });
      $('span').attr({
        id: 1,
        name: 'zs',
      });

jQuery 内容文本值

      // 主要针对元素的内容还有表单的值操作。
      // 1. 普通元素内容 html()( 相当于原生inner HTML)
      // html() // 获取元素的内容
      // html(''内容'') // 设置元素的内容

      // 2. 普通元素文本内容 text() (相当与原生 innerText)
      // text() // 获取元素的文本内容
      // text(''文本内容'') // 设置元素的文本内容

      // 主要针对元素的内容还有表单的值操作。
      // 3. 表单的值 val()( 相当于原生value)
      // val() // 获取表单的值
      // val(''内容'') // 设置表单的值

			// parents 返回指定祖先元素
			
      $('div').parents('.yeye'); // 拿到祖先元素,爷爷
      $('.box').html('黑盒子');
      $('span').text('内容很长');
      $('input').val('要搜索点啥呢');
      var grandpa = $('.box3').parents('.box1');
      console.log(grandpa.text());

jQuery 元素操作

      // 主要是遍历、创建、添加、删除元素操作。
      // $.each()遍历元素
      // 遍历数组
      var arr = ['apple', 'banana', 'orange'];
      $(arr).each(function (i, ele) {
        console.log(i); // 0  1  2
        console.log(ele); //apple  banana  orange
      });

      // 遍历对象
      var obj = {
        name: '李飞',
        age: 15,
        score: function () {
          console.log('考试');
        },
      };
      $.each(obj, function (i, ele) {
        console.log(i); // name age score
        console.log(ele); // 李飞  15  function score()
      });

      // $(''<li></li>''); 动态的创建了一个 <li>
      var li = $('<li>我是后来者</li>');

      // append prepend 添加元素
      // after before 外部添加
      // remove empty html 删除元素

      // element.remove() // 删除匹配的元素(本身)
      // element.empty() // 删除匹配的元素集合中所有的子节点
      // element.html('''') // 清空匹配的元素内容
      // remove 删除元素本身。
      // empt() 和 html('''') 作用等价,都可以删除元素里面的内容,只不过 html 还可以设置内容。
      $('ul').append(li);
      $('ul').prepend(li);
      $('ul').after(li);
      $('ul').before(li);
      $('ul li').eq(0).remove();
      $('ul li').eq(1).empty();
      $('ul li').eq(0).html('');

jQuery 位置操作

      // 1. offset() 设置或获取元素偏移
      $('.box1').offset({
        top: 100,
        left: 100,
      });

      // 2: position() 获取元素偏移
      console.log($('.box1').position().top); //100

      // 3. scrollTop()/scrollLeft() 设置或获取元素被卷去的头部和左侧
      // scrollTop() 方法设置或返回被选元素被卷去的头部。
      // 不跟参数是获取,参数为不带单位的数字则是设置被卷去的头部。
			console.log($('.box1').scrollTop()); //295
			
      var backTop = $('.goback').offset().top;
      // console.log(backTop);
      $(window).scroll(function (e) {
        if (window.pageYOffset >= backTop) {
          $('.goback').fadeIn();
        } else {
          $('.goback').fadeOut();
        }
      });
      $('.goback').click(function () {
        $('body, html').stop().animate({
          scrollTop: 0,
        });
      });

事件绑定、解绑、自动触发、冒泡、对象深浅拷贝

      // on() 方法在匹配元素上绑定一个或多个事件的事件处理函数
      $('.box1').on('click', function () {
        $(this)
          .css({ border: '1px solid blue' })
          .mouseover(function () {
            console.log(123);
          });
      });
      $('.box1').on({
        click: function () {
          $(this).css({ border: '1px solid blue' });
        },
        mouseover: function () {
          $(this).css({ background: 'red' });
        },
        mouseleave: function () {
          $(this).css({ background: '' });
        },
      });

      // 如果事件处理程序相同
      $('div').on('mouseenter mouseleave', function () { //多个事件中不用, 逗号隔开,直接空格连写
      $(this).toggleClass('current')
      })

      // 事件委派和给动态元素绑定事件
      // 可以事件委派操作 。事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。
      $('ul').on('click', 'li', function () {
        $(this).css({ border: '1px solid blue' });
      });

      // 动态创建的元素,click() 没有办法绑定事件, on() 可以给动态生成的元素绑定事件
      $('ul').on('click', 'li', function () {
        $(this).css({ border: '1px solid blue' });
      });
      var li = $('<li>我是后来创建的li</li>');
      $('ul').append(li);

      // 自动触发事件
      // 1:事件封装
      $('.box1').click(function () {
        console.log('click');
      });
      // 2:触发事件
      $('.box1').click();

      // 1:事件封装
      $('input').on('focus', function () {
        $(this).val('今日热点');
      });
      // // 2:触发事件
      // $('input').focus();
      // // 输入框不会高亮 就是不会触发元素的默认行为
      $('input').triggerHandler('focus');

      // 事件冒泡 e.stopPropagation()阻止冒泡到父元素上
      $(document).click(function () {
        console.log('document');
      });
      $('.box1').click(function (e) {
        e.stopPropagation();
        console.log('box1');
      });

      // 对象拷贝 $.extends
      var a = {
        name: 'A',
        age: 16,
        msg: {
          sex: '男',
        },
        say: function () {
          console.log('say');
        },
      };
      var b = {
        name: 'B',
        age: 18,
        msg: {
          sex: '女',
        },
        Hi: function () {
          console.log('Hi');
        },
      };
      // 1. 浅拷贝把原来对象里面的复杂数据类型地址拷贝给目标对象
      // (a会把b的同名属性给合并,并以b的值为准,不同的则会新添加到对象中)
      // (修改b的b.msg.sex = '女女', a的a.msg.sex = '女女'也会变成了女女,修改任何一方都会影响彼此的值)
      $.extend(a, b);
      a.msg.sex = '男男';
      // b.msg.sex = '女女';
      // b.name = 'b';
      console.log(a); //Object { name: "B", age: 18, msg: {…}, say: say(), Hi: Hi() }
      console.log(b); //Object { name: "b", age: 18, Hi: Hi() }

      // 2. 深拷贝把里面的数据完全复制一份给目标对象 如果里面有不冲突的属性,会合并到一起
      // (修改任何一个对象,彼此独立,互不影响)
      $.extend(true, a, b);
      a.msg.sex = '男孩';
      b.msg.sex = '女孩';
      console.log(a);
      console.log(b);

下一篇:web前端 - 精简系列四:JS面向对象和Es6