jQuery扩展_动力节点Java学院整理


Posted in jQuery onJuly 05, 2017

当我们使用jQuery对象的方法时,由于jQuery对象可以操作一组DOM,而且支持链式操作,所以用起来非常方便。

但是jQuery内置的方法永远不可能满足所有的需求。比如,我们想要高亮显示某些DOM元素,用jQuery可以这么实现:

$('span.hl').css('backgroundColor', '#fffceb').css('color', '#d85030');

$('p a.hl').css('backgroundColor', '#fffceb').css('color', '#d85030');

总是写重复代码可不好,万一以后还要修改字体就更麻烦了,能不能统一起来,写个highlight()方法?

$('span.hl').highlight();

$('p a.hl').highlight();

答案是肯定的。我们可以扩展jQuery来实现自定义方法。将来如果要修改高亮的逻辑,只需修改一处扩展代码。这种方式也称为编写jQuery插件。

编写jQuery插件

给jQuery对象绑定一个新方法是通过扩展$.fn对象实现的。让我们来编写第一个扩展——highlight1()

$.fn.highlight1 = function () {
  // this已绑定为当前jQuery对象:
  this.css('backgroundColor', '#fffceb').css('color', '#d85030');
  return this;
}

注意到函数内部的this在调用时被绑定为jQuery对象,所以函数内部代码可以正常调用所有jQuery对象的方法。

对于如下的HTML结构:

<!-- HTML结构 -->
<div id="test-highlight1">
  <p>什么是<span>jQuery</span></p>
  <p><span>jQuery</span>是目前最流行的<span>JavaScript</span>库。</p>
</div>

来测试一下highlight1()的效果:

'use strict';
$('#test-highlight1 span').highlight1();

什么是jQuery

jQuery是目前最流行的JavaScript库。

细心的童鞋可能发现了,为什么最后要return this;?因为jQuery对象支持链式操作,我们自己写的扩展方法也要能继续链式下去:

$('span.hl').highlight1().slideDown();

不然,用户调用的时候,就不得不把上面的代码拆成两行。

但是这个版本并不完美。有的用户希望高亮的颜色能自己来指定,怎么办?

我们可以给方法加个参数,让用户自己把参数用对象传进去。于是我们有了第二个版本的highlight2()

$.fn.highlight2 = function (options) {
  // 要考虑到各种情况:
  // options为undefined
  // options只有部分key
  var bgcolor = options && options.backgroundColor || '#fffceb';
  var color = options && options.color || '#d85030';
  this.css('backgroundColor', bgcolor).css('color', color);
  return this;
}

对于如下HTML结构:

<!-- HTML结构 -->
<div id="test-highlight2">
  <p>什么是<span>jQuery</span> <span>Plugin</span></p>
  <p>编写<span>jQuery</span> <span>Plugin</span>可以用来扩展<span>jQuery</span>的功能。</p>
</div>

来实测一下带参数的highlight2()

'use strict';
$('#test-highlight2 span').highlight2({
  backgroundColor: '#00a8e6',
  color: '#ffffff'
});

什么是jQuery Plugin

编写jQuery Plugin可以用来扩展jQuery的功能。

对于默认值的处理,我们用了一个简单的&&||短路操作符,总能得到一个有效的值。

另一种方法是使用jQuery提供的辅助方法$.extend(target, obj1, obj2, ...),它把多个object对象的属性合并到第一个target对象中,遇到同名属性,总是使用靠后的对象的值,也就是越往后优先级越高:

// 把默认值和用户传入的options合并到对象{}中并返回:
var opts = $.extend({}, {
  backgroundColor: '#00a8e6',
  color: '#ffffff'
}, options);

紧接着用户对highlight2()提出了意见:每次调用都需要传入自定义的设置,能不能让我自己设定一个缺省值,以后的调用统一使用无参数的highlight2()

也就是说,我们设定的默认值应该能允许用户修改。

那默认值放哪比较合适?放全局变量肯定不合适,最佳地点是$.fn.highlight2这个函数对象本身。

于是最终版的highlight()终于诞生了:

$.fn.highlight = function (options) {
  // 合并默认值和用户设定值:
  var opts = $.extend({}, $.fn.highlight.defaults, options);
  this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
  return this;
}

// 设定默认值:
$.fn.highlight.defaults = {
  color: '#d85030',
  backgroundColor: '#fff8de'
}

这次用户终于满意了。用户使用时,只需一次性设定默认值:

$.fn.highlight.defaults.color = '#fff';
$.fn.highlight.defaults.backgroundColor = '#000';

然后就可以非常简单地调用highlight()了。

对如下的HTML结构:

<!-- HTML结构 -->
<div id="test-highlight">
  <p>如何编写<span>jQuery</span> <span>Plugin</span></p>
  <p>编写<span>jQuery</span> <span>Plugin</span>,要设置<span>默认值</span>,并允许用户修改<span>默认值</span>,或者运行时传入<span>其他值</span>。</p>
</div>

实测一下修改默认值的效果:

'use strict';
$.fn.highlight.defaults.color = '#659f13';
$.fn.highlight.defaults.backgroundColor = '#f2fae3';

$('#test-highlight p:first-child span').highlight();

$('#test-highlight p:last-child span').highlight({
  color: '#dd1144'
});

如何编写jQuery Plugin

编写jQuery Plugin,要设置默认值,并允许用户修改默认值,或者运行时传入其他值。

最终,我们得出编写一个jQuery插件的原则:

1.给$.fn绑定函数,实现插件的代码逻辑;

2.插件函数最后要return this;以支持链式调用;

3.插件函数要有默认值,绑定在$.fn.<pluginName>.defaults上;

4.用户在调用时可传入设定值以便覆盖默认值。

针对特定元素的扩展

我们知道jQuery对象的有些方法只能作用在特定DOM元素上,比如submit()方法只能针对form。如果我们编写的扩展只能针对某些类型的DOM元素,应该怎么写?

还记得jQuery的选择器支持filter()方法来过滤吗?我们可以借助这个方法来实现针对特定元素的扩展。

举个例子,现在我们要给所有指向外链的超链接加上跳转提示,怎么做?

先写出用户调用的代码:

$('#main a').external();

然后按照上面的方法编写一个external扩展:

$.fn.external = function () {
  // return返回的each()返回结果,支持链式调用:
  return this.filter('a').each(function () {
    // 注意: each()内部的回调函数的this绑定为DOM本身!
    var a = $(this);
    var url = a.attr('href');
    if (url && (url.indexOf('http://')===0 || url.indexOf('https://')===0)) {
      a.attr('href', '#0')
       .removeAttr('target')
       .append(' <i class="uk-icon-external-link"></i>')
       .click(function () {
        if(confirm('你确定要前往' + url + '?')) {
          window.open(url);
        }
      });
    }
  });
}

对如下的HTML结构:

<!-- HTML结构 -->
<div id="test-external">
  <p>如何学习<a href="http://jquery.com" rel="external nofollow" >jQuery</a>?</p>
  <p>首先,你要学习<a href="/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000" rel="external nofollow" >JavaScript</a>,并了解基本的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML" rel="external nofollow" >HTML</a>。</p>
</div>

实测外链效果:

'use strict';
$('#test-external a').external();

小结

扩展jQuery对象的功能十分简单,但是我们要遵循jQuery的原则,编写的扩展方法能支持链式调用、具备默认值和过滤特定元素,使得扩展方法看上去和jQuery本身的方法没有什么区别。

jQuery 相关文章推荐
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 jQuery
快速掌握jquery分页插件jqPaginator的使用方法
Aug 09 jQuery
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 jQuery
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
jQuery easyui datagird编辑行删除行功能的实现代码
Sep 20 jQuery
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
jquery操作select常见方法大全【7种情况】
May 28 jQuery
js、jquery实现列表模糊搜索功能过程解析
Mar 27 jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 #jQuery
jQuery事件_动力节点Java学院整理
Jul 05 #jQuery
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 #jQuery
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 #jQuery
jquery拖动改变div大小
Jul 04 #jQuery
jQuery实现动态给table赋值的方法示例
Jul 04 #jQuery
jQuery操作DOM_动力节点Java学院整理
Jul 04 #jQuery
You might like
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
express express-session的使用小结
2018/12/12 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python中获取对象信息的方法
2015/04/27 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python单元测试与测试用例简析
2019/11/09 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
java关于string最常出现的面试题整理
2021/01/18 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
运动会广播稿500字
2014/01/28 职场文书
培训主管岗位职责
2014/02/01 职场文书
班主任评语大全
2014/04/26 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
python blinker 信号库
2022/05/04 Python