聊聊jQuery的扩展(插件)

jQuery Validate插件详解与实战应用 内置规则不够用?那就自己造!前端验证只为提升体验,永远不要替代后端校验;推荐使用混合模式声明规则,兼顾灵活性与可维护性;复杂业务逻辑封装成独立 JS 模块(如生产环境打包压缩,开启 Gzip;收集用户行为日志,持续优化提示文案。graph TDA[用户输入] --> B{前端实时验证}B -->|通过| C[提交至服务器]B -->|失败| D[提示并高亮错误]C --> E{后端二次校验}E -->|合法| F[写入数据库] 阅读详情

编写jQuery扩展

当我们使用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对象绑定一个新方法是通过扩展$.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();

细心的童鞋可能发现了,为什么最后要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提供的辅助方法$.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插件的原则:

  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">jQuery</a>?</p>
    <p>首先,你要学习<a href="/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000">JavaScript</a>,并了解基本的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML">HTML</a>。</p>
</div>

实测外链效果:

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

小结

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

基于jQuery的动态数据绑定下拉框插件实战 回顾整个过程,我们从一个简单的想法出发,逐步构建出一个功能完备、性能优良、易于维护的jQuery下拉框插件。它不仅仅是一个UI组件,更是一套完整的解决方案:数据层:支持异步加载、缓存、错误处理交互层:事件系统完善,用户体验流畅视觉层:可主题化,动画细腻架构层:模块化设计,便于扩展但也要清醒认识到:随着Vue/React等现代框架的普及,纯jQuery插件的应用场景正在减少。不过这其中的设计思想——封装、解耦、状态管理、性能优化——永远不会过时。 阅读详情

相关推荐

基于jQuery与Bootstrap的多功能日期时间选择器插件实战集合

回头看这个看似简单的日期选择器集成,我们其实走过了很长一段路:从 DOM 结构设计到 CSS 层级协调再到触控交互优化最后深入 i18n 和 a11y每一步都在提醒我们:前端开发早已不再是“切页面”那么简单。真正优秀的工程师,懂得在技术边界之间跳舞——既要尊重框架约定,又要保留灵活性;既要追求极致体验,又不能过度设计。而这一切的背后,是对用户、对团队、对系统的深刻理解。

weixin_29301059的博客 436

什么?都2024年了你还不知道浏览器插件怎么安装?新手必看的扩展插件安装指南

主流四款浏览器扩展插件保姆级安装教程

黑灰若山 9665

基于jQuery.qrcode的二维码生成实战示例

最后我们来盘点一下的优势和局限性。技术没有绝对的好坏,只有适不适合。可能不像某些现代库那样炫酷,但它胜在稳定、轻量、易用。在一个追求快速交付、注重用户体验的时代,有时候最朴素的工具反而最有力量。下次当你需要在网页上加个二维码时,不妨试试这个“老伙计”,说不定会有意外惊喜呢 😉。本文还有配套的精品资源,点击获取简介:jQuery.qrcode.js是一款轻量级前端插件,可在浏览器中无需依赖第三方服务即可生成二维码,广泛应用于网址、文本、名片等信息的快速编码。

weixin_42097508的博客 878

网络安全中常用浏览器插件、拓展

分享就到此啦,其实不是网络安全相关,但是还是有一些蛮不错的,分享一下吧。

2401_88751384的博客 1889

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题

1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con...

weixin_42304393的博客 2万+

调试备忘录-SWD协议解析

目录--点击可快速直达 文章目录写在前面1  SWD协议简介2  SWD物理层协议解析2.1  SWD通信时序分析2.2  SWD 寄存器简介2.2.1  DP寄存器2.2.2  AP寄存器2.3  SWD通信流程2.3.1  SWD复位2.3.2  SWD读IDCODE2.3.3  SWD清除错误标志位,并且使能AP调试2.3.4  SWD读取AP IDR(也就是AP寄存器的ID CODE)2.3.5  SWD读写MCU任意寄存器 写在前面 最近由于公司需要,所以就做了个基于SWD协议的离线烧写器。由于.

洛神殇的博客 1万+

Edge扩展插件安装

注意:某些插件可能需要你在使用前进行一些设置或者授权操作。弹框点击"添加扩展"

m0_60769905的博客 5204

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 298

关于扩展插件

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

中控易动的博客 556

NOIP2008年普及组初赛题目答案及解析

NOIP2008年初赛详细题解

城南蝈蝈 927

【Ambari-Metrics监控】Grafana+Infinity快速构建DEMO-实战教学

摘要:本文介绍了如何通过Infinity插件在Grafana中监控Ambari-Metrics(AMS)的CPU核数指标。内容包括配置AMS REST API数据源、创建Dashboard面板、设置JSON解析规则,将时间戳和数值映射为时序数据。最终实现单个节点CPU核数曲线的可视化展示,该方法可扩展至其他AMS指标监控。文章提供了完整的配置示例和API调用验证方法,适用于Grafana 9.x及以上版本对接Ambari集群监控场景。

TTBIGDATA的博客 1352

5款谷歌Chrome扩展插件,多年收藏浏览器扩展分享

但苹果的号召力只影响到了移动领域,而在各种网站上只有少数网站适配的黑暗模式功能,还是有大量的网站使用白底作为背景,这就使得浏览网页的体验很割裂。相信大家都用过谷歌自带的网页翻译,自带翻译最大的缺点是全网页替换翻译,而沉浸式翻译可以在保留原文的基础上,在下方显示译文,这样就算碰到了看不明白的机翻,也能方便对照原文查看正确翻译了。手机的听歌识曲大家都用过,但有时候逛网站遇到了好听的歌曲,同时你还是用的耳机,就不方便用手机听歌识曲了,而这款插件就可以在你浏览到好听歌曲的同时,帮你自动识别歌曲名字。

最软库官方账号 5485

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 438

jQuery插件扩展extend的实现原理

相信每位前端的小伙伴对jQuery都不陌生吧,它最大的魅力之一就是有大量的插件,去帮助我们更轻松的实现各种功能。 前几天晚上,闲来无事,就自己动手写了个简单的jQuery插件,功能很简单,只是让选定的元素高亮,但是其中的一些思想,还是很值得学习的,可以戳这里查看代码。 本文不聊怎么写jQuery插件,我们聊聊怎么去实现jQuery的插件扩展功能,extend是怎么实现把我们写的插件挂载到jQu...

weixin_30563917的博客 86

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 672

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

java extend内部实现_[Java教程]jQuery插件扩展extend的实现原理

[Java教程]jQuery插件扩展extend的实现原理0 2016-06-23 18:00:06相信每位前端的小伙伴对jQuery都不陌生吧,它最大的魅力之一就是有大量的插件,去帮助我们更轻松的实现各种功能。前几天晚上,闲来无事,就自己动手写了个简单的jQuery插件,功能很简单,只是让选定的元素高亮,但是其中的一些思想,还是很值得学习的,可以戳这里查看代码。本文不聊怎么写jQu...

weixin_35972981的博客 240

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

tipso支持html,聊聊一款轻巧的jQuery提示框插件:Tipso

1、引入文件2、HTMLTipso或者:Tipso使用属性 data-tipso 的值作为 tip 的内容是时,需要设置 useTitle: false;使用 title 属性作为 tip 的内容则设置 useTitle: true 或省略此参数。3、JavaScript$(function(){$('#tip').tipso({useTitle:false});});其实在用JS在页面中调用...

weixin_39959298的博客 395

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

聊聊前段插件之Datatables

在web开发过程中表格数据展示是一个很常见的功能,而且用户对其要求也比较高,性能、易用性等。今天我推荐一款利器给大家——Datatables;Datatables中文网。   一、介绍 Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。(摘抄自Datatables中文网)   二...

weixin_30851867的博客 124

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MP-Ukagaka伪春菜插件扩展:在对话框用iframe显示链接

MP-Ukagaka伪春菜插件写了个Javascript扩展:在对话框用Iframe显示链接。 调用方法: displayLinkInBox(对象,显示方式) 如:displayLinkInBox(this,'full'); 显示方式有两种:full即充满对话框,否则替换链接a标签。 使用方法: 在链接里加入onclick事件,如在kaito的对话框里输入gtalk在线聊天,不同的gmai...

weixin_34279061的博客 338

Flower Agent 独立文档站:基于 Sphinx 与 uv 的构建体系及本地运行指南

Flower 仓库中的 `agent/docs` 目录承载了一个与框架文档完全分离的独立文档站——Flower Agent 文档。本文围绕该文档站的定位、文档边界与内容结构展开,并结合仓库中的 [agent/pyproject.toml](https://link.gitcode.com/i/31b8b0478ce95b18a749d40c1609b033)、[agent/docs/Makefil

gitblog_00800的博客 365

jQuery已经过时了,还需要学吗?

说起jQuery,很多刚参加工作的程序员都没用过,甚至没听过。曾几何时jQuery可是秒杀一切Js库,大有一统江山的情况,可是在顶峰的时候,瞬间被Vue、React、Angela三大框架斩于马下。从百度指数,我们也看出在2015-2019是jQuery最高峰的时候,后面急转如下,基本回归到刚刚兴起的情景。今天我结合jQuery从兴起、顶峰、凋零三个阶段聊聊我的感受,从中对于我们编程可以获得的启发。...

zls365365的博客 1126

disable 在js中用_js和jquery设置disabled属性为true使按钮失效

mybatis 调用存储过程 jQuery之换肤与cookie插件有时候一个网页可以有多个皮肤进行选择,也就是不同的背景,或是一整套新的css,能使整个页面变成另一种风格. 这个功能可以用jQuery来实现.外加cookie插件.有了cookie,就可以长时间的保存 ...iOS10 关于推送-b最近在研究iOS10关于推送的新特性, 相比之前确实做了很大的改变,总结起来主要是以下几点: 推送内...

weixin_39695672的博客 442

深入解析jQuery事件系统:三层架构、事件委托与实战技巧

DOM事件处理是前端开发的核心基础,它实现了用户交互与页面响应的桥梁。其原理基于事件冒泡与捕获机制,通过监听用户操作触发相应函数执行。这一技术价值在于解耦用户行为与业务逻辑,提升代码可维护性。在应用场景上,无论是传统网站还是现代Web应用,高效的事件管理都至关重要。本文聚焦于jQuery事件系统,它作为一套经典的跨浏览器兼容解决方案,通过统一事件对象、高效的事件存储分发机制和简洁的API层,封装了原生事件的复杂性。其中,事件委托机制能显著优化动态内容交互与性能,而命名空间和自定义事件则为模块化开发提供了便利

weixin_34007020的博客 428

JQ是如何变得更加强大

通过几个案例需求来了解Jquery如何扩展方法 需求 给 $ 添加4个工具方法: min(a, b) : 返回较小的值 max(c, d) : 返回较大的值 leftTrim() : 去掉字符串左边的空格 rightTrim() : 去掉字符串右边的空格 jQuery.extend() jquery_plugin.js (function(){ jQuery.extend({ min:function(a, b){ return a < b ? a : b; }

Hemx的博客 197
上一篇: jQuery实现表单全选、全不选以及反选的功能
下一篇: php版-阿里大于短信验证码服务教程
刘五分
博客等级 码龄10年 15粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值