jQuery原理第四天

insertAfter

实现insertAfter需要用到原生JavaScript的nextSibling属性

元素.insertAfter.指定元素 ==>将元素添加到指定元素外部的后面

insertAfter实现原理

insertAfter: function (sele) {
    // 1.统一的将传入的数据转换为jQuery对象
    var $target = $(sele);
    var $this = this;
    var res = [];
    // 2.遍历取出所有指定的元素
    $.each($target, function (key, value) {
        var parent = value.parentNode;
        var nextNode = $.get_nextsibling(value);
        // 2.遍历取出所有的元素
        $this.each(function (k, v) {
            // 3.判断当前是否是第0个指定的元素
            if (key === 0) {
                // 直接添加
                parent.insertBefore(v, nextNode);
                res.push(v);
            } else {
                // 先拷贝再添加
                var temp = v.cloneNode(true);
                parent.insertBefore(temp, nextNode);
                res.push(temp);
            }
        });
    });
    // 3.返回所有添加的元素
    return $(res);
},

replaceAll

function replaceAll(source, target) {
    // 1.将元素插入到指定元素的前面
    $(source).insertBefore(target);
    // 2.将指定元素删除
    $(target).remove();
}
var p = document.querySelector("p");
var li = document.querySelector("li");
// replaceAll(p, li);

replaceAll实现原理

replaceAll: function (sele) {
    // 1.统一的将传入的数据转换为jQuery对象
    var $target = $(sele);
    var $this = this;
    var res = [];
    // 2.遍历取出所有指定的元素
    $.each($target, function (key, value) {
        var parent = value.parentNode;
        var nextNode = $.get_nextsibling(value);
        // 2.遍历取出所有的元素
        $this.each(function (k, v) {
            // 3.判断当前是否是第0个指定的元素
            if (key === 0) {
                // 1.将元素插入到指定元素的前面
                $(v).insertBefore(value);
                // 2.将指定元素删除
                $(value).remove();
                res.push(v);
            } else {
                // 先拷贝再添加
                var temp = v.cloneNode(true);
                // 1.将元素插入到指定元素的前面
                $(temp).insertBefore(value);
                // 2.将指定元素删除
                $(value).remove();
                res.push(temp);
            }
        });
    });
    // 3.返回所有添加的元素
    return $(res);
},

attr

<!--
 * @Author: 码小余
 * @Date: 2020-06-26 10:55:03
 * @LastEditTime: 2020-06-26 10:58:53
 * @FilePath: \代码\jQuery原理\15-jQuery属性操作相关方法.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>15-jQuery属性操作相关方法</title>
    <script src="js/njQuery-1.3.0.js"></script>
    <script>
      $(function () {
        /*
            1.attr(): 设置或者获取元素的属性节点值
        */
        // 传递一个参数, 返回第一个元素属性节点的值
        // console.log($("span").attr("class"));
        // 传递两个参数, 代表设置所有元素属性节点的值
        // 并且返回值就是方法调用者
        // console.log($("span").attr("class", "abc"));
        // 传递一个对象, 代表批量设置所有元素属性节点的值
        $("span").attr({
          class: "123",
          name: "888",
        });
      });
    </script>
  </head>
  <body>
    <span class="span1" name="it666"></span>
    <span class="span2" name="lnj"></span>
  </body>
</html>

attr实现原理

attr: function (attr, value) {
    // 1. 判断是否是字符串
    if (njQuery.isString(attr)) {
        // 判断是一个字符串还是两个字符串
        if (arguments.length === 1) {
            return this[0].getAttribute(attr);
        } else {
            this.each(function (key, ele) {
                ele.setAttribute(attr, value);
            });
        }
    }
    // 2. 判断是否是对象
    else if (njQuery.isObject(attr)) {
        var $this = this;
        // 遍历取出所有属性节点的名称和对应的值
        $.each(attr, function (key, value) {
            // 遍历取出所有的元素
            $this.each(function (k, ele) {
                ele.setAttribute(key, value);
            });
        });
    }
    return this;
},

prop

<!--
 * @Author: 码小余
 * @Date: 2020-06-26 11:05:25
 * @LastEditTime: 2020-06-26 12:32:24
 * @FilePath: \代码\jQuery原理\16-jQuery吧属性操作相关方法.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>16-jQuery属性操作相关方法</title>
    <!--<script src="js/jquery-1.12.4.js"></script>-->
    <script src="js/njQuery-1.3.0.js"></script>
    <script>
      $(function () {
        /*
            2.prop(): 设置或者获取元素的属性值
        */

        // 传递两个参数, 代表设置所有元素属性节点的值
        // 并且返回值就是方法调用者
        console.log($("span").prop("abc", "lnj"));

        // 传递一个参数, 返回第一个元素属性节点的值
        console.log($("span").prop("abc"));

        // 传递一个对象, 代表批量设置所有元素属性节点的值
        $("span").prop({
          aaa: "111",
          bbb: "222",
        });
      });
    </script>
  </head>
  <body>
    <span class="span1" name="it666"></span>
    <span class="span2" name="lnj"></span>
  </body>
</html>

prop实现原理

prop: function (attr, value) {
    // 1. 判断是否是字符串
    if (njQuery.isString(attr)) {
        // 判断是一个字符串还是两个字符串
        if (arguments.length === 1) {
            return this[0][attr];
        } else {
            this.each(function (key, ele) {
                ele[attr] = value;
            });
        }
    }
    // 2. 判断是否是对象
    else if (njQuery.isObject(attr)) {
        var $this = this;
        // 遍历取出所有属性节点的名称和对应的值
        $.each(attr, function (key, value) {
            // 遍历取出所有的元素
            $this.each(function (k, ele) {
                ele[key] = value;
            });
        });
    }
    return this;
},

css

<!--
 * @Author: 码小余
 * @Date: 2020-06-26 11:22:58
 * @LastEditTime: 2020-06-26 11:23:55
 * @FilePath: \代码\jQuery原理\17-jQuery属性操作相关方法.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>17-jQuery属性操作相关方法</title>
    <!--<script src="../jQuery原理/js/jquery-1.12.4.js"></script>-->
    <script src="js/njQuery-1.3.0.js"></script>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .box1 {
        width: 100px;
        height: 100px;
        background: red;
        margin-bottom: 10px;
      }
      .box2 {
        width: 200px;
        height: 200px;
        background: blue;
        margin-bottom: 10px;
      }
    </style>
    <script>
      $(function () {
        /*
                3.css(): 设置获取样式
            */
        // 传递一个参数, 返回第一个元素指定的样式
        // console.log($("div").css("height"));
        // 传递两个参数, 代表设置所有元素样式
        // 并且返回值就是方法调用者
        // console.log($("div").css("height", "50px"));
        // 传递一个对象, 代表批量设置所有元素样式
        $("div").css({
          height: "50px",
          backgroundColor: "pink",
        });
        // 获取样式
        // var div = document.querySelector("div");
        // console.log(window.getComputedStyle(div)["height"]);
        // console.log(div.currentStyle["height"]);
        // 设置样式
        // div.style["height"] = "200px";
      });
    </script>
  </head>
  <body>
    <div class="box1">div1</div>
    <div class="box2">div2</div>
  </body>
</html>

css实现原理

css: function (attr, value) {
    // 1. 判断是否是字符串
    if (njQuery.isString(attr)) {
        // 判断是一个字符串还是两个字符串
        if (arguments.length === 1) {
            return njQuery.getStyle(this[0], attr);
        } else {
            this.each(function (key, ele) {
                ele.style[attr] = value;
            });
        }
    }
    // 2. 判断是否是对象
    else if (njQuery.isObject(attr)) {
        var $this = this;
        // 遍历取出所有属性节点的名称和对应的值
        $.each(attr, function (key, value) {
            // 遍历取出所有的元素
            $this.each(function (k, ele) {
                ele.style[key] = value;
            });
        });
    }
    return this;
},

val

<!--
 * @Author: 码小余
 * @Date: 2020-06-26 11:36:18
 * @LastEditTime: 2020-06-26 11:36:19
 * @FilePath: \代码\jQuery原理\18-jQuery 属性操作相关方法.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>18-jQuery属性操作相关方法</title>
    <!--<script src="../jQuery原理/js/jquery-1.12.4.js"></script>-->
    <script src="js/njQuery-1.3.0.js"></script>
    <script>
      $(function () {
        /*
             4.val(): 获取设置value的值
         */
        // 不传递参数, 返回第一个元素指定的样式
        // console.log($('input').val());

        // 传递两个参数, 代表设置所有元素样式
        // 并且返回值就是方法调用者
        console.log($("input").val("新设置的"));

        /*
            var input = document.querySelector("input");
            // input.setAttribute("value", "123456");
            var btn = document.querySelector("button");
            btn.onclick = function (ev) {
                // console.log(input.getAttribute("value"));
                // console.log($('input').val());
                console.log(input.value);
            }
            */
      });
    </script>
  </head>
  <body>
    <button>获取</button>
    <input type="text" value="默认值1" />
    <input type="text" value="默认值2" />
  </body>
</html>

val实现原理

val: function (content) {
    if (arguments.length === 0) {
        return this[0].value;
    } else {
        this.each(function (key, ele) {
            ele.value = content;
        });
        return this;
    }
},

hasClass

<!--
 * @Author: 码小余
 * @Date: 2020-06-26 12:06:00
 * @LastEditTime: 2020-06-26 12:08:32
 * @FilePath: \代码\jQuery原理\19-jQuery属性操作相关方法.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>19-jQuery属性操作相关方法</title>
    <!--<script src="../jQuery原理/js/jquery-1.12.4.js"></script>-->
    <script src="js/njQuery-1.3.0.js"></script>
    <script>
      $(function () {
        /*
            5.hasClass(): 判断元素中是否包含指定类
         */
        // 传递参数, 只要调用者其中一个包含指定类就返回true,否则返回false
        // console.log($("div").hasClass("cc"));
        // console.log($("div").hasClass("abc"));
        // console.log($("div").hasClass("bb"));
        // 没有传递参数, 返回false
        console.log($("div").hasClass());
        /*
            var div = document.querySelector("div");
            // console.log(div.getAttribute("class"));
            // console.log(div.className);
            // 1.获取元素中class保存的值
            var className = " "+div.className+" ";
            // 2.通过indexOf判断是否包含指定的字符串
            // console.log(className.indexOf("abc") != -1);
            // console.log(className.indexOf("bb"));
            // console.log(className.indexOf(" "+"bb"+" "));
            console.log(className.indexOf(" "+"dd"+" "));
            */
      });
    </script>
  </head>
  <body>
    <div class="aabb cc dd"></div>
    <div class="aabb bb"></div>
  </body>
</html>

hasClass实现原理

hasClass: function (name) {
    var flag = false;
    if (arguments.length === 0) {
        return flag;
    } else {
        this.each(function (key, ele) {
            // 1.获取元素中class保存的值
            var className = " " + ele.className + " ";
            // 2.给指定字符串的前后也加上空格
            name = " " + name + " ";
            // 3.通过indexOf判断是否包含指定的字符串
            if (className.indexOf(name) != -1) {
                flag = true;
                return false;
            }
        });
        return flag;
    }
},
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码小余の博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值