博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展 -------jQuery
阅读量:4323 次
发布时间:2019-06-06

本文共 3126 字,大约阅读时间需要 10 分钟。

本文摘要:

编写jQuery插件

为了满足需求,我们经常会调用一些插件,js插件都是别人写的,今天就来了解了解一些方法。

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

$.fn.highlight1 = function () {    // this已绑定为当前jQuery对象:    this.css('backgroundColor', '#fffceb').css('color', '#d85030');    return this;  //返回this  就是说还可以继续链式写法}

使用:

$('#XX').highlight1();
$('#XX').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;}

调用:

$('#XXX').highlight2({    backgroundColor: '#00a8e6',    color: '#ffffff'});

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

 

另一种方法是使用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()了。

$.fn.highlight.defaults.color = '#659f13';  //设置默认值$.fn.highlight.defaults.backgroundColor = '#f2fae3';$('#xxx').highlight();$('#yyy').highlight({         color: '#dd1144'});

最终,我们得出编写一个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(' ')             .click(function () {                if(confirm('你确定要前往' + url + '?')) {                    window.open(url);                }            });        }    });}

对如下的HTML结构:

如何学习jQuery

首先,你要学习JavaScript,并了解基本的 HTML

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

效果:

 

小结

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

 

转载于:https://www.cnblogs.com/Sea1ee/p/7192975.html

你可能感兴趣的文章
NSString 的常用方法
查看>>
mysql的engine不同,导致事物回滚失败的问题
查看>>
JAVAWeb使用POI做导出Excel
查看>>
今天解决了首页无头像被显示的问题
查看>>
charts 画折线图
查看>>
[py]__name__ 属于哪个文件
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
实验四【bx】和loop的使用
查看>>
P1313 计算系数
查看>>
myBatis之入门示例
查看>>
tensorflow 变量共享
查看>>
NSString的长度比较方法(一)
查看>>
初识JavaScript
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
Testing your Xamarin app on Android device
查看>>
丢失控制文件恢复实验记录--4(在线日志文件没有损坏,归档日志丢失,直接重建控制文件(跟踪控制文件trace是旧的情况))...
查看>>