11月20日学习内容整理:jquery插件

补充:

》》》链式操作本质上就是返回当前操作的对象,意思是无论对一个jquery对象进行怎样的操作最后都会再返回当前操作的对象,这也就是我们为什么能连续写方法的原因

》》》removedata("key")  删除之前赋的值

一、插件:给别人用的,jquery的命名空间下添加新的功能。多用于插件开发者向 jQuery 中添加新函数时使用。

1、给jquery添加扩展

》》》$.extend({

  名字:function(){

    执行语句;    

  }

})

》》》外部使用:$.名字()就会执行函数中的语句

2、给jquery对象添加扩展

》》》$.fn.extend({

  名字:function(){

    执行语句;

  }

})

》》》外部使用:$(选择器).名字()就会执行函数中的语句

3、补充::::

》》》》函数中的执行语句也可以是调用某个函数,这样外部一调用名字就可以直接执行某个函数了

重要重要重要》》》》两种扩展中函数的语句中this就代表谁调用谁就是this

 

 

》》》》注意注意注意:::::

1、自己写插件时的几点:

(1)全局变量污染(指的是我们引用别人的插件,但是插件中恰好把我们所创建的全局变量修改了)

》》》解决办法:JS中函数限制变量的作用域 ,所以我们在写插件的时候要用函数包裹我们扩展的那些变量和函数

(2)全局不可以访问函数内部定义的变量,函数内部可以访问全局变量

(3)如何防止$被修改(指的是别人写的插件可能会把$修改成别的值,一旦发生这样的情况,后续的代码就无法继续执行了)

》》》解决办法:还是包裹成一个函数,用传参的方式,我们显式的把jQuery传进去,在函数内部用jq表示jQuery

(4)用匿名函数来简化我们保存自己变量或函数的操作,因为匿名函数外部价格括号就可以调用,省去了我们再自己设置变量和函数调用的麻烦

 

举例:

》》》》jQuery扩展示例.html    --> 演示了如何给jQuery添加扩展

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery扩展示例</title>
</head>
<body>
<div>111</div>
<script src="jquery-3.2.1.min.js"></script>
<script>
    // 给jQuery添加扩展
    $.extend({
        xyy: function () {
            console.log("脱衣服");
        }
    });

    // 给jQuery对象添加扩展
    $.fn.extend({
        xxx: function () {
            console.log("ooo");
        }
    })
</script>
</body>
</html>

 

》》》》jQuery扩展示例2.html   --> 演示了如何把之前的校验代码弄成一个jQuery扩展,就是写在一个validate函数中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆校验作业</title>
    <style>
        .error {
            color: red;
        }
    </style>
</head>
<body>
<form id="f1" action="">
    <p>
        <label for="user">姓名</label>
        <input class="require" id="user" type="text" name="username">
        <span class="error"></span>
    </p>
    <p>
        <label for="pwd">密码</label>
        <input class="require" id="pwd" type="password" name="passwd">
        <span class="error"></span>
    </p>
    <input type="submit" value="登录">
</form>
<script src="jquery-3.2.1.min.js"></script>
<script>
    function validate(arg) {
        var $currEle = arg;
        console.log(arg);
        $currEle.find(":submit").on("click", function () {
        // 每次判断之前都清空之前的错误信息
        $(".error").text("");
        //   定义一个用于判断是否进行下一个事件的标志位
        var flag = true;
        // 校验
        // 找需要校验的input
//        $("form input[type='text'], form input[type='password']")
        $currEle.find("input.require").each(function () {
            // this  --> 当前的input框  --> DOM对象
            var currVal = $(this).val();  // 取到当前input框的值
            if (currVal.length === 0){  // 根据值的长度和0去比较
                // 提示错误信息
                // $(this).next()  --> 找到span标签
                // 取label的text来拼接错误信息
                // $(this).prev();  --> 取到当前input标签前面的label标签
                var msgQz = $(this).prev().text();
                $(this).next().text(msgQz + "不能为空");
                flag = false;
                return false;  // 跳出each循环
            }
        });
        return flag;
    });
    }
    // 文档加载完之后执行
    $(document).ready(function () {
         $("#f1").check();
    });
    // 给我的jQuery对象添加了一个名叫check的扩展
    $.fn.extend({
        check: function () {
            // this表示的是的当前操作的标签
            validate(this);
        }
    });
</script>
</body>
</html>

 

》》》》jQuery扩展示例3.html   --> 演示了如何把jQuery扩展放到单独的JS文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆校验作业</title>
    <style>
        .error {
            color: red;
        }
    </style>
</head>
<body>

<form id="f1" action="">
    <p>
        <label for="user">姓名</label>
        <input class="require" id="user" type="text" name="username">
        <span class="error"></span>
    </p>

    <p>
        <label for="pwd">密码</label>
        <input class="require" id="pwd" type="password" name="passwd">
        <span class="error"></span>
    </p>

    <input type="submit" value="登录">

</form>
<script src="jquery-3.2.1.min.js"></script>
<script src="extend.js"></script>
<script>
    $("#f1").check();
</script>
</body>
</html>
 a = function(jq){
    function f2(arg) {
        var $currEle = arg;
        console.log(arg);
        $currEle.find(":submit").on("click", function () {
        // 每次判断之前都清空之前的错误信息
        jq(".error").text("");
        //   定义一个用于判断是否进行下一个事件的标志位
        var flag = true;
        // 校验
        // 找需要校验的input
        $currEle.find("input.require").each(function () {
            // this  --> 当前的input框  --> DOM对象
            var currVal = jq(this).val();  // 取到当前input框的值
            if (currVal.length === 0){  // 根据值的长度和0去比较
                // 提示错误信息
                // $(this).next()  --> 找到span标签
                // 取label的text来拼接错误信息
                // $(this).prev();  --> 取到当前input标签前面的label标签
                var msgQz = jq(this).prev().text();
                jq(this).next().text(msgQz + "不能为空");
                flag = false;
                return false;  // 跳出each循环
            }
        });
        return flag;
    });
    }
        // 文档加载完之后执行
    jq(document).ready(function () {
//         validate();
         jq("#f1").check();
    });

    // 给我的jQuery对象添加了一个名叫check的扩展
    jq.fn.extend({
        check: function () {
            // this表示的是的当前操作的标签
            f2(this);
        }
    });
 };
// 为了防止某些坏人把$赋值成别的变量
a(jQuery);

 

》》》extend.js --> 我们自己写的jQuery扩展文件
上面的那部分是没有优化的方式,即我们自己定义变量和函数
下面的是使用自执行函数优化的方式(以后我们都用这种方式)

// 匿名函数
 (function (jq) {
     function f2(arg) {
        var $currEle = arg;
        console.log(arg);
        $currEle.find(":submit").on("click", function () {
        // 每次判断之前都清空之前的错误信息
        jq(".error").text("");
        //   定义一个用于判断是否进行下一个事件的标志位
        var flag = true;
        // 校验
        // 找需要校验的input
//        $("form input[type='text'], form input[type='password']")
        $currEle.find("input.require").each(function () {
            // this  --> 当前的input框  --> DOM对象
            var currVal = jq(this).val();  // 取到当前input框的值
            if (currVal.length === 0){  // 根据值的长度和0去比较
                // 提示错误信息
                // $(this).next()  --> 找到span标签
                // 取label的text来拼接错误信息
                // $(this).prev();  --> 取到当前input标签前面的label标签
                var msgQz = jq(this).prev().text();
                jq(this).next().text(msgQz + "不能为空");
                flag = false;
                return false;  // 跳出each循环
            }
        });
        return flag;
    });
    }
        // 文档加载完之后执行
    jq(document).ready(function () {
//         validate();
         jq("#f1").check();
    });

    // 给我的jQuery对象添加了一个名叫check的扩展
    jq.fn.extend({
        check: function () {
            // this表示的是的当前操作的标签
            f2(this);
        }
    });
 })(jQuery);

 

posted @ 2017-11-20 15:49  九二零  阅读(79)  评论(0编辑  收藏  举报