补充:
》》》链式操作本质上就是返回当前操作的对象,意思是无论对一个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添加扩展
jQuery扩展示例 111
》》》》jQuery扩展示例2.html --> 演示了如何把之前的校验代码弄成一个jQuery扩展,就是写在一个validate函数中
登陆校验作业
》》》》jQuery扩展示例3.html --> 演示了如何把jQuery扩展放到单独的JS文件中
登陆校验作业
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);