整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

jQuery技巧分享深度解析与实战:如何自定义扩展$.

【jQuery技巧分享】深度解析与实战:如何自定义扩展$.val()方法实现更多功能

引言

在Web前端开发中,jQuery作为一款流行的JavaScript库,以其简洁易用的API设计深受开发者喜爱。其内置的`$.val()`方法主要用于获取或设置表单元素的值,但有时候我们可能需要扩展其功能以满足特定业务需求。本文将带你深入探讨如何自定义扩展jQuery的`$.val()`方法,使其拥有更多的实用功能。

##

一、$.val()方法基础认知

javascript
// 获取元素的值
var inputVal = $('#myInput').val();

// 设置元素的值
$('#myInput').val('New Value');

然而,原生的`$.val()`方法在处理复杂场景时可能会显得力不从心,例如处理多选框、复选框组的值,或者进行更复杂的逻辑判断等。

##

二、自定义扩展$.val()方法的需求分析

在实际项目中,我们可能会遇到如下需求:

1. 对于多选框或复选框,一次性获取所有选中项的值。

2. 根据特定规则对输入值进行格式化处理后再设置到元素上。

3. 在获取或设置值的同时触发自定义的回调函数。

为了满足这些需求,我们可以考虑通过扩展`$.val()`方法来实现。

##

三、自定义扩展$.val()方法的实现步骤

###

步骤1:理解$.fn.val源码及扩展原理

javascript
// 原始$.fn.val方法保存
var _val = $.fn.val;

// 重写$.fn.val方法
$.fn.val = function(value) {
    // 这里可以添加我们的自定义逻辑
};

###

步骤2:扩展$.val()以支持多选框和复选框组

javascript
$.fn.extend({
    val: function(value) {
        var elem = this[0];

        if (elem.tagName === 'SELECT' && elem.multiple) {
            // 处理多选框情况
            if (value === undefined) {
                return this.find(':selected').map(function() {
                    return $(this).val();
                }).get();
            } else {
                // 需要传入数组形式的值
                this.find('option').prop('selected', false);
                $.each(value, function(i, v) {
                    this.find('[value="'+v+'"]').prop('selected', true);
                });
                return this;
            }
        } else if (Array.isArray(this.length)) {
            // 处理复选框组情况
            // ...
        }

        // 调用原始$.fn.val方法
        return _val.apply(this, arguments);
    }
});

###

步骤3:增加值的格式化处理与回调函数

javascript
$.fn.extend({
    val: function(value, formatFn, callback) {
        var elem = this[0],
            returnValue;

        // 如果传入了value并且有formatFn,则先格式化再设置值
        if (value !== undefined && typeof formatFn === 'function') {
            value = formatFn.call(this, value);
        }

        // 设置值并触发原始$.fn.val方法
        returnValue = _val.call(this, value);

        // 执行回调函数
        if (typeof callback === 'function') {
            callback.call(this, value);
        }

        // 返回原始$.fn.val方法的返回值
        return returnValue;
    }
});

##

四、实战案例与应用示例

javascript
// 获取多选框的所有选中值
var selectedValues = $('select[multiple]').val();

// 设置复选框组,并在操作完成后执行回调
$('input[type="checkbox"]').val([true, false, true], function(value) {
    console.log('Checkbox values updated:', value);
});

// 格式化输入框的值并在设置后执行回调
$('#myInput').val('1234567890', function(val) {
    return val.replace(/\D/g, ''); // 只保留数字
}, function(formattedValue) {
    console.log('Formatted input value:', formattedValue);
});

总结来说,通过对jQuery的`$.val()`方法进行合理扩展,我们可以定制出更加灵活且强大的功能,从而更好地服务于我们的实际开发工作。当然,在进行此类扩展时,我们也需要注意保持代码的可读性和维护性,确保扩展功能既高效又稳定。同时,不断学习和完善自己的编程技能,方能在瞬息万变的前端世界中游刃有余。

面的表格列出了所有用于处理 HTML 和 CSS 的 jQuery 方法。

下面的方法适用于 HTML 和 XML 文档。除了:html() 方法。

方法描述
addClass()向被选元素添加一个或多个类名
after()在被选元素后插入内容
append()在被选元素的结尾插入内容
appendTo()在被选元素的结尾插入 HTML 元素
attr()设置或返回被选元素的属性/值
before()在被选元素前插入内容
clone()生成被选元素的副本
css()为被选元素设置或返回一个或多个样式属性
detach()移除被选元素(保留数据和事件)
empty()从被选元素移除所有子节点和内容
hasClass()检查被选元素是否包含指定的 class 名称
height()设置或返回被选元素的高度
html()设置或返回被选元素的内容
innerHeight()返回元素的高度(包含 padding,不包含 border)
innerWidth()返回元素的宽度(包含 padding,不包含 border)
insertAfter()在被选元素后插入 HTML 元素
insertBefore()在被选元素前插入 HTML 元素
offset()设置或返回被选元素的偏移坐标(相对于文档)
offsetParent()返回第一个定位的祖先元素
outerHeight()返回元素的高度(包含 padding 和 border)
outerWidth()返回元素的宽度(包含 padding 和 border)
position()返回元素的位置(相对于父元素)
prepend()在被选元素的开头插入内容
prependTo()在被选元素的开头插入 HTML 元素
prop()设置或返回被选元素的属性/值
remove()移除被选元素(包含数据和事件)
removeAttr()从被选元素移除一个或多个属性
removeClass()从被选元素移除一个或多个类
removeProp()移除通过 prop() 方法设置的属性
replaceAll()把被选元素替换为新的 HTML 元素
replaceWith()把被选元素替换为新的内容
scrollLeft()设置或返回被选元素的水平滚动条位置
scrollTop()设置或返回被选元素的垂直滚动条位置
text()设置或返回被选元素的文本内容
toggleClass()在被选元素中添加/移除一个或多个类之间切换
unwrap()移除被选元素的父元素
val()设置或返回被选元素的属性值(针对表单元素)
width()设置或返回被选元素的宽度
wrap()在每个被选元素的周围用 HTML 元素包裹起来
wrapAll()在所有被选元素的周围用 HTML 元素包裹起来
wrapInner()在每个被选元素的内容周围用 HTML 元素包裹起来
$.escapeSelector()转义CSS选择器中有特殊意义的字符或字符串
$.cssHooks提供了一种方法通过定义函数来获取和设置特定的CSS值

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

TML超大文件上传和断点续传的实现,VUE 大文件分片上传(断点续传、并发上传、秒传),完美解决PHP无法上传大文件方法,NGINX 实现文件夹上传(保留目录结构),http之实现文件上传与下载,内网 批量大文件上传下载,浏览器超大文件上传和断点续传的实现,超大文件上传解决方案:分片断点上传,

VUE+ELEMENT 上传文件及文件夹,VUE上传大文件的三种解决方案,DJANGO+VUE实现文件夹上传,前端实现文件夹的上传和下载,HTML+前端超大视频上传解决方案,网页 项目文件夹上传下载解决方案,

在网上也花时间搜索过相关的资料,论坛里面也有网友交流过,还加过很多QQ群微信群,但是结果都不太令人满意。网上的文章吧基本上都是相互抄袭的,内容不能说是一模一样吧,但是实际上都是差不多的,提到的也是HTML5的API,基本上都是说的用的HTML5的API。你说不能用吧他也能传,但是兼容性不行,只能在chrome上面用,用吧也只是基本上的功能,你没办法扩展。

不能够满足公司项目上的需求,公司这边实际上是需要一个成熟的商业解决方案,而不是一个文件的上传思路。但是网上几乎所有的文章都是在讲思路和想法,很少有提供成熟解决方案的。另外一方面就是公司项目需要最好能够提供国企和央企的成功案例,这个也是客户那边的要求。项目这块要求比较高,不可能随便在网上找几个开源的代码糊弄过去,因为后期项目要做维护和升级。

前端用了JS,JQuery,vue2,vue3,vue-cli,html5,html,前端框架也比较多,但是网上提供的都是代码片断。

找了一圈基本上都是讲上传的,下载的讲的很少,文章里面也是写的不详细

客户那边是一家国企,主要也是给政府和央企做项目。实际上客户对具体的技术并不关心。客户关注点不在这块,主要是对稳定性和兼容性比较在意。

网上搜了一下,基本上大部分的文章里面提到的前端JS或VUE或HTML5上传文件夹的方案都是使用JS的API来实现的,也就是html5提供的一个API,也就是chrome提供的API。用是能用,但是不够好用,有很多限制,也不够灵活。不太能够满足用户的实际应用需求,

多多少少还是有点问题,稳定性,灵活性,可扩展性,安全性方面还是有点问题。chrome的每个域名只允许5个TCP连接的限制,这个基本上是一个无法逾越的鸿沟,目前为止网上还没有发现哪家公司或者个人能够突破的。

我们做项目的话个人用户比较少,一般都是行业用户,比如政府,公司,金融,这类企业,他们对用户体验要求较高。就实际项目开发和实施的情况来看,html5或者chrome提供的功能基本上都是不能够满足他们需求的,都需要我们进行定制开发。

文件夹上传,html5提供了API,用户开始用的时候还行,然后就提了要求要求支持断点续传,

客户这边是一个政府单位,涉密了,就不透露单位名称了,每天主要就是上传和下载一些资料,数据都是加密的。

客户那边每天都会上传和下载资料,

视频教程:https://www.ixigua.com/7226245960341389859

1.下载示例

https://gitee.com/xproer/up6-vue-cli



将up6组件复制到项目中

示例中已经包含此目录



1.引入up6组件



2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



3.处理事件



启动测试



启动成功



效果



数据库



源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

控件源码下载:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权码生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1