【jQuery技巧分享】深度解析与实战:如何自定义扩展$.val()方法实现更多功能
引言
在Web前端开发中,jQuery作为一款流行的JavaScript库,以其简洁易用的API设计深受开发者喜爱。其内置的`$.val()`方法主要用于获取或设置表单元素的值,但有时候我们可能需要扩展其功能以满足特定业务需求。本文将带你深入探讨如何自定义扩展jQuery的`$.val()`方法,使其拥有更多的实用功能。
##
javascript
// 获取元素的值
var inputVal = $('#myInput').val();
// 设置元素的值
$('#myInput').val('New Value');
然而,原生的`$.val()`方法在处理复杂场景时可能会显得力不从心,例如处理多选框、复选框组的值,或者进行更复杂的逻辑判断等。
##
在实际项目中,我们可能会遇到如下需求:
1. 对于多选框或复选框,一次性获取所有选中项的值。
2. 根据特定规则对输入值进行格式化处理后再设置到元素上。
3. 在获取或设置值的同时触发自定义的回调函数。
为了满足这些需求,我们可以考虑通过扩展`$.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
*请认真填写需求信息,我们会在24小时内与您取得联系。