【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,前端框架也比較多,但是網上提供的都是代碼片斷。
找了一圈基本上都是講上傳的,下載的講的很少,文章里面也是寫的不詳細
客戶那邊是一家國企,主要也是給政府和央企做項目。實際上客戶對具體的技術并不關心??蛻絷P注點不在這塊,主要是對穩定性和兼容性比較在意。
網上搜了一下,基本上大部分的文章里面提到的前端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小時內與您取得聯系。