JQuery

作者: Snackk | 来源:发表于2018-10-25 22:33 被阅读0次
    jQuery

    jQuery是一个轻量级的、兼容多浏览器的JavaScript库。

    “Write less, do more.“(一行代码)

    jQuery版本

    1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。
    2.x:不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。
    3.x:不兼容IE678,只支持最新的浏览器。
    

    会用jquery的效果对比

     $('#d1').pve().css('color','red')
     document.getElementById('id').previousElementSibling.style.color='red'
    

    使用

    1. 下载jQuery
        http://jquery.com/download/
    2. 导入
        1. script导入本地的文件
        2. 使用CDN
    3. 按照jQuery的语法使用就可以啦
        注意:先导入再使用
    

    Jquery对象是一个数组类型
    DOM对象是一个标签类型

    只有jquery对象才能调用jquery方法,DOM对象只能调用DOM方法。
    JQuery对象索引取值得到一个DOM对象,$(DOM对象)得到一个Jquery对象
    

    约定,我们在声明一个jQuery对象变量的时候在变量名前面加上$:

    var $variable = jQuery对像
    var variable = DOM对象
    $variable[0]//jQuery对象转成DOM对象
    

    jQuery语法:

    $("选择器").方法()
    

    拿上面那个例子举例,jQuery对象和DOM对象的使用:

    $("#i1").html();//jQuery对象可以使用jQuery的方法
    $("#i1")[0].innerHTML;// DOM对象使用DOM的方法
    

    查找标签

    基本旋转器
    id选择器:

    $("#id")
    

    标签选择器:

    $("tagName")
    

    class选择器:

    $(".className")
    

    配合使用:

    $("div.c1")  // 找到有c1 class类的div标签
    

    所有元素选择器:

    $("*")
    

    组合选择器:

    $("#id, .className, tagName")
    

    层级选择器:

    $("x y");// x的所有后代y(子子孙孙)
    $("x > y");// x的所有儿子y(儿子)
    $("x + y")// 找到所有紧挨在x后面的y
    $("x ~ y")// x之后所有的兄弟y
    

    基本筛选器:

    :first // 第一个
    :last // 最后一个
    :eq(index)// 索引等于index的那个元素
    :even // 匹配所有索引值为偶数的元素,从 0 开始计数
    :odd // 匹配所有索引值为奇数的元素,从 0 开始计数
    :gt(index)// 匹配所有大于给定索引值的元素
    :lt(index)// 匹配所有小于给定索引值的元素
    :not(元素选择器)// 移除所有满足not条件的标签
    :has(元素选择器)// 选取所有包含一个或多个标签在其内的标签(指的是从后代元素找)
    

    例子:

    $("div:has(h1)")// 找到所有后代中有h1标签的div标签
    $("div:has(.c1)")// 找到所有后代中有c1样式类的div标签
    $("li:not(.c1)")// 找到所有不包含c1样式类的li标签
    $("li:not(:has(a))")// 找到所有后代中不含a标签的li标签
    

    属性选择器:

    [attribute]
    [attribute=value]// 属性等于
    [attribute!=value]// 属性不等于
    

    例子:

    // 示例
    <input type="text">
    <input type="password">
    <input type="checkbox">
    $("input[type='checkbox']");// 取到checkbox类型的input标签
    $("input[type!='text']");// 取到类型不是text的input标签
    

    表单筛选器:

    :text
    :password
    :file
    :radio
    :checkbox
    
    :submit
    :reset
    :button
    

    例子:

    $(":checkbox") // 找到所有的checkbox
    表单对象属性:

    :enabled
    :disabled
    :checked
    :selected
    

    例子:

    找到可用的input标签

    <form>
      <input name="email" disabled="disabled" />
      <input name="id" />
    </form>
    

    $("input:enabled") // 找到可用的input标签

    找到被选中的option:

    <select id="s1">
      <option value="beijing">北京市</option>
      <option value="shanghai">上海市</option>
      <option selected value="guangzhou">广州市</option>
      <option value="shenzhen">深圳市</option>
    </select>
    

    $(":selected") // 找到所有被选中的option

    筛选器方法

    下一个元素:

    $("#id").next()
    $("#id").nextAll()
    $("#id").nextUntil("#i2")
    

    上一个元素:

    $("#id").prev()
    $("#id").prevAll()
    $("#id").prevUntil("#i2")
    

    父亲元素:

    $("#id").parent()
    $("#id").parents()  // 查找当前元素的所有的父辈元素
    $("#id").parentsUntil() // 查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止。
    

    儿子和兄弟元素:

    $("#id").children();// 儿子们
    $("#id").siblings();// 兄弟们
    

    等价:

    $("div").find("p")等价于$("div p")
    

    补充:

    .first() // 获取匹配的第一个元素
    .last() // 获取匹配的最后一个元素
    .not() // 从匹配元素的集合中删除与指定表达式匹配的元素
    .has() // 保留包含特定后代的元素,去掉那些不含有指定后代的元素。
    .eq() // 索引值等于指定值的元素
    

    操作标签:

    样式类

    addClass();// 添加指定的CSS类名。
    removeClass();// 移除指定的CSS类名。
    hasClass();// 判断样式存不存在
    toggleClass();// 切换CSS类名,如果有就移除,如果没有就添加。
    

    示例:开关灯和模态框

    CSS

    css("color","red")//DOM操作:tag.style.color="red"
    

    示例:

    $("p").css("color", "red"); //将所有p标签的字体设置为红色
    

    位置操作

    offset()// 获取匹配元素在当前窗口的相对偏移或设置元素位置
    position()// 获取匹配元素相对父元素的偏移
    scrollTop()// 获取匹配元素相对滚动条顶部的偏移
    scrollLeft()// 获取匹配元素相对滚动条左侧的偏移
    

    .offset()方法允许我们检索一个元素相对于文档(document)的当前位置。和 .position()的差别在于: .position()是相对于相对于父级元素的位移。

    <button id="b2" class="btn btn-default c2 hide">返回顶部</button>
    <script src="jquery.js"></script>
    <script>
    
      $(window).scroll(function () {
        if ($(window).scrollTop() > 100) {
          $("#b2").removeClass("hide");
        }else {
          $("#b2").addClass("hide");
        }
      });
    
    
    
      $("#b2").on("click", function () {
        $(window).scrollTop(0);
      })
    </script>
    

    尺寸:

    height()   获取高度
    width()     获取高度
    innerHeight()  获取高度加内填充
    innerWidth()    获取宽度加内填充
    outerHeight()   获取高度加内填充加边框
    outerWidth()    获取宽度加内填充加边框
    

    文本操作(text不认识a标签,而html认识a标签)

    HTML代码(html()):

    html()// 取得第一个匹配元素的html内容
    html(val)// 设置所有匹配元素的html内容
    

    文本值( text()):

    text()// 取得所有匹配元素的内容
    text(val)// 设置所有匹配元素的内容
    

    值:

    val()// 取得第一个匹配元素的当前值
    val(val)// 设置所有匹配元素的值
    val([val1, val2])// 设置多选的checkbox、多选select的值
    

    属性操作

    1. 想要获取返回文本类的属性用attr(获取的是字符串,标签上写的属性用attr)
    2. 想要获取返回布尔值的属性用prop(DOM对象有的属性用prop)
    

    用于ID等或自定义属性:

    attr(attrName)// 返回第一个匹配元素的属性值
    attr(attrName, attrValue)// 为所有匹配元素设置一个属性值
    attr({k1: v1, k2:v2})// 为所有匹配元素设置多个属性值
    removeAttr()// 从每一个匹配的元素中删除一个属性
    

    用于checkbox和radio

    prop() // 获取属性
    removeProp() // 移除属性
    

    虽然都是属性,但他们所指的属性并不相同,attr所指的属性是HTML标签属性,而prop所指的是DOM对象属性,可以认为attr是显式的,而prop是隐式的。

    举个例子:

    <input type="checkbox" id="i1" value="1">
    

    针对上面的代码,

    $("#i1").attr("checked")  // undefined
    $("#i1").prop("checked")  // false
    

    如果换成下面的代码:

    <input type="checkbox" checked id="i1" value="1">
    

    再执行:

    $("#i1").attr("checked")   // checked
    $("#i1").prop("checked")  // true
    

    总结:

    对于标签上有的能看到的属性和自定义属性都用attr
    对于返回布尔值的比如checkbox、radio和option的是否被选中都用prop。
    

    文档处理
    添加到指定元素内部的后面

    $(A).append(B)// 把B追加到A
    $(A).appendTo(B)// 把A追加到B
    

    添加到指定元素内部的前面

    $(A).prepend(B)// 把B前置到A
    $(A).prependTo(B)// 把A前置到B
    

    添加到指定元素外部的后面

    $(A).after(B)// 把B放到A的后面
    $(A).insertAfter(B)// 把A放到B的后面
    

    添加到指定元素外部的前面

    $(A).before(B)// 把B放到A的前面
    $(A).insertBefore(B)// 把A放到B的前面
    

    移除和清空元素

     $(A).remove()// 从DOM中删除所有匹配的元素。
     $(A).empty()// 删除匹配的元素集合中所有的子节点。
    

    例子:

    点击按钮在表格添加一行数据。
    
    点击每一行的删除按钮删除当前行数据。
    

    替换

    $(A).replaceWith(B)  //B替换A
    $(A).replaceAll(B)   //A替换B
    

    克隆

    clone()// 参数
    
    <body>
    
    <button class="c1">屠龙宝刀,点击就送!</button>
    <script src="jquery.js"></script>
    <script>
        $(".c1").click(function () {
            // 克隆自己
            $(this).clone(true).insertAfter(this);
        })
    </script>
    </body>
    

    python(链式操作)

    • 调用实例的方法后返回当前实例本身,就可以支持链式操作
        class Person(object):
            def __init__(self, name):
                self.name = name
    
            def run(self):
                print('{} 在跑...'.format(self.name))
                return self  # 调用实例的方法后返回当前实例本身,就可以支持链式操作
    
            def sing(self):
                print('{} 在唱 燃烧我的卡路里...'.format(self.name))
    
    
        xyh = Person('夏雨豪')
        xyh.run().sing()
        
    

    事件绑定

    像click、keydown等DOM中定义的事件,我们都可以使用.on()方法来绑定事件,但是hover这种jQuery中定义的事件就不能用.on()方法来绑定了。

    1.    .on( events [, selector ],function(){})
    2.    .events ([, selector ],function(){})
    

    移除事件(和on事件相反)

    .off( events [, selector ][,function(){}])
    

    阻止后续事件执行

    return false; // 常见阻止表单提交等  
    e.preventDefault();
    

    提交按钮是先执行函数再刷新页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="">
        <input type="text" name="name" id="i1">
        <input type="submit" value="提交" id="b1">
    </form>
    <script src="jquery.js"></script>
    <script>
        $("#b1").on('click', function () {
            var value = $("#i1").val().trim();
            if (!value) {
                // 阻止表单的提交
                // 阻止后面的事件执行
                return false;
            }
        })
    </script>
    </body>
    </html>
    

    阻止事件冒泡(父子标签问题--->e表示事件本身)

    e.stopPropagation();
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>阻止事件冒泡</title>
    </head>
    <body>
    <div>
        <p>
            <span>点我</span>
        </p>
    </div>
    <script src="jquery-3.3.1.min.js"></script>
    <script>
        $("span").click(function (e) {
            alert("span");
            e.stopPropagation();
        });
    
        $("p").click(function () {
            alert("p");
        });
        $("div").click(function () {
            alert("div");
        })
    </script>
    </body>
    </html>
    

    事件委托

    事件委托是通过事件冒泡的原理,利用父标签去捕获子标签的事件。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>事件委托</title>
    </head>
    <body>
    
    <div>
        <p id="p1">
            <button class="c1">点我</button>
        </p>
    </div>
    
    <script src="jquery.js"></script>
    <script>
        // 找到页面上所有的.c1样式类的按钮,绑定事件
        // $('.c1').on('click', function () {
        //     alert('我是一个按钮!');
        // });
        // 借助事件冒泡,来给未来的标签绑定事件 ----> 事件委托
        $('#p1').on('click', '.c1', function () {  // $('p .c1')
            console.log(this);  // 触发事件的那个标签
            console.log('我是一个按钮!');
        });
    
        // 在页面上添加一个.c1样式类的按钮
        $('#p1').append('<button class="c1">点我2</button>');
    
    
    </script>
    </body>
    </html>
    

    常用事件

    click(function(){...})
    hover(function(){...})
    blur(function(){...})  失去焦点
    focus(function(){...})  获取焦点
    change(function(){...})
    keyup(function(){...})
    

    键盘被按下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    </head>
    <body>
    
    <script src="jquery.js"></script>
    <script>
        // 按键被按下
        $(window).keydown(function (event) {
            // 打印下哪个按键被按下
            // console.log(event.keyCode);
            if (event.keyCode === 16){
                console.log('shift被按下了');
            }
        });
        // 按键被抬起的事件
         $(window).keyup(function (event) {
            // 打印下哪个按键被按下
            // console.log(event.keyCode);
            if (event.keyCode === 16){
                console.log('shift被抬起了');
            }
        })
    </script>
    </body>
    </html>
    

    批量操作(keydown和keyup事件组合示例:)

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <title>Title</title>
    </head>
    <body>
    
    
    <table border="1">
      <thead>
      <tr>
        <th>#</th>
        <th>姓名</th>
        <th>操作</th>
      </tr>
      </thead>
      <tbody>
      <tr>
        <td><input type="checkbox"></td>
        <td>Egon</td>
        <td>
          <select>
            <option value="1">上线</option>
            <option value="2">下线</option>
            <option value="3">停职</option>
          </select>
        </td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td>Alex</td>
        <td>
          <select>
            <option value="1">上线</option>
            <option value="2">下线</option>
            <option value="3">停职</option>
          </select>
        </td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td>Yuan</td>
        <td>
          <select>
            <option value="1">上线</option>
            <option value="2">下线</option>
            <option value="3">停职</option>
          </select>
        </td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td>EvaJ</td>
        <td>
          <select>
            <option value="1">上线</option>
            <option value="2">下线</option>
            <option value="3">停职</option>
          </select>
        </td>
      </tr>
      <tr>
        <td><input type="checkbox"></td>
        <td>Gold</td>
        <td>
          <select>
            <option value="1">上线</option>
            <option value="2">下线</option>
            <option value="3">停职</option>
          </select>
        </td>
      </tr>
      </tbody>
    </table>
    
    
    <script src="jquery.js"></script>
    <script>
        var flag = false;
        // shift被按下,就将全局的flag置为true
        $(window).keydown(function (e) {
            if (e.keyCode === 16){
                flag = true;
            }
        });
        // shift被抬起的时候,就将全局的flag置为false
        $(window).keyup(function (e) {
            if (e.keyCode === 16){
                flag = false;
            }
        });
        // 按下shift键,进入批量编辑模式
        // 应该是给select标签绑定change事件
        $('td>select').change(function () {
            // 判断是否进入批量编辑模式
            // 如何判断shift按键被按下
            // 如何判断当前行被选中
            var isChecked = $(this).parent().prev().prev().find(':checkbox').prop('checked');
            if ( flag && isChecked){
                // 1. 取到当前select选中的值
                var checkedValue = $(this).val();
                // 2. 找到所有被选中的行
                // 3. 把选中行的select置为和我一样的值
                $('tr:has(input:checked)').find('select').val(checkedValue);
            }
        })
    </script>
    </body>
    </html>
    

    hover事件示例(鼠标移上移下显示下拉框):

    hover(不是DOM事件,是jQuery封装的)
                接收两个匿名函数
                $('').hover(function(){鼠标移上去要做的事儿}, function(){鼠标移出去要做的事儿})
    

    另一种绑定:
    想使用事件委托的方式绑定hover事件处理函数,可以参照如下代码分两步绑定事件:

    $('ul').on('mouseenter', 'li', function() {//绑定鼠标进入事件
        $(this).addClass('hover');
    });
    $('ul').on('mouseleave', 'li', function() {//绑定鼠标划出事件
        $(this).removeClass('hover');
    });
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>hover示例</title>
      <style>
        * {
          margin: 0;
          padding: 0;
        }
        .nav {
          height: 40px;
          width: 100%;
          background-color: #3d3d3d;
          position: fixed;
          top: 0;
        }
    
        .nav ul {
          list-style-type: none;
          line-height: 40px;
        }
    
        .nav li {
          float: left;
          padding: 0 10px;
          color: #999999;
          position: relative;
        }
        .nav li:hover {
          background-color: #0f0f0f;
          color: white;
        }
    
        .clearfix:after {
          content: "";
          display: block;
          clear: both;
        }
    
        .son {
          position: absolute;
          top: 40px;
          right: 0;
          height: 50px;
          width: 100px;
          background-color: #00a9ff;
          display: none;
        }
    
        .hover .son {
          display: block;
        }
      </style>
    </head>
    <body>
    <div class="nav">
      <ul class="clearfix">
        <li>登录</li>
        <li>注册</li>
        <li>购物车
          <p class="son hide">
            空空如也...
          </p>
        </li>
      </ul>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
    $(".nav li").hover(
      function () {
        $(this).addClass("hover");
      },
      function () {
        $(this).removeClass("hover");
      }
    );
    </script>
    </body>
    </html>
    

    input获取焦点失去焦点触发

    window.onload的区别(js代码可以写到head中)

    window.onload()函数有覆盖现象,必须等待着图片资源加载完成之后才能调用
    

    jQuery的这个入口函数没有函数覆盖现象,文档加载完成之后就可以调用(建议使用此函数,再另一个文件中写)先导入再使用

    $(document).ready(function () {
        })
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="jquery.js"></script>
        <script src="xyh.js"></script>
        <script src="ws.js"></script>
        <script>
            window.onload = function () {
                // input框失去焦点才触发
                $('#i1').on('blur', function () {
                    var value = $(this).val();
                    console.log(value);
                });
                // input框只要值发生变化就触发
                $('#i1').on('input', function () {
                    var value = $(this).val();
                    console.log(value);
                })
            }
        </script>
    </head>
    <body>
    
    <input type="text" id="i1">
    
    </body>
    </html>
    

    页面载入:

    当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。

    两种写法:

    $(document).ready(function(){
    // 在这里写你的JS代码...
    })
    简写:
    
    $(function(){
    // 你在这里写你的代码
    })
    

    动画效果

    // 基本
    show([s,[e],[fn]])
    hide([s,[e],[fn]])
    toggle([s],[e],[fn])
    // 滑动
    slideDown([s],[e],[fn])
    slideUp([s,[e],[fn]])
    slideToggle([s],[e],[fn])
    // 淡入淡出
    fadeIn([s],[e],[fn])
    fadeOut([s],[e],[fn])
    fadeTo([[s],o,[e],[fn]])
    fadeToggle([s,[e],[fn]])
    // 自定义(了解即可)
    animate(p,[s],[e],[fn])
    

    点赞实例

    opacity: 1   不透明
    opacity: 0  透明
    
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>点赞动画示例</title>
      <style>
        div {
          position: relative;
          display: inline-block;
        }
        div>i {
          display: inline-block;
          color: red;
          position: absolute;
          right: -16px;
          top: -5px;
          opacity: 1;
        }
      </style>
    </head>
    <body>
    
    <div id="d1">点赞</div>
    <script src="jquery.js"></script>
    <script>
      $("#d1").on("click", function () {
        var newI = document.createElement("i");
        newI.innerText = "+1";
        $(this).append(newI);
        $(this).children("i").animate({
          opacity: 0
        }, 1000)
      })
    </script>
    </body>
    </html>
    

    each

    描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组。

    jQuery.each(collection, callback(indexInArray, valueOfElement)):
    

    描述:遍历一个jQuery对象,为每个匹配元素执行一个函数。

    .each(function(index, Element)):
    

    终止each循环 return false
    终止本次循环 return

    #1
    
    $("li").each(function(){
      $(this).addClass("c1");
    });
    
    #2
    
    $("li").addClass("c1");  // 对所有标签做统一操作
    
    

    .data():

    .data(key, value):

    描述:在匹配的元素上存储任意相关数据。

    $("div").data("k",100);//给所有div标签都保存一个名为k,值为100
    

    .data(key):

    $("div").data("k");//返回第一个div标签中保存的"k"的值
    

    .removeData(key)

    描述:移除存放在元素上的数据,不加key参数表示移除所有保存的数据。

    $("div").removeData("k");  //移除元素上存放k对应的数据
    

    插件

    jQuery.extend(object)
    

    jQuery的命名空间下添加新的功能。多用于插件开发者向 jQuery 中添加新函数时使用。

    jQuery.fn.extend(object)
    

    一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法。

    相关文章

      网友评论

          本文标题:JQuery

          本文链接:https://www.haomeiwen.com/subject/nydhtqtx.html