【JQuery】擴展 $.val()

一、背景

公司的老項目前端還是用的jquery,也沒有條件引入vue,所以對于一個實體對象的取值和賦值還是很麻煩的:
例如:

image.png

所以想擴展一下$.val()函數

二、目標

html元素上使用name結構化數據實體,
然后用val獲取整個實體,可以正確處理子對象和數組對象以及多選select。
例如:

三、修改方案

找到$().val的源碼;
會用jquery的同學都很清楚,val有2個邏輯,不帶參是get,帶參是set;
看源碼,有一個JQuery.valHooks 對象,如果當前元素可以匹配到則會直接調用valHooks中定義好的getset方法;
所以只要在這里加入我們定義好的元素和處理函數就可以了

四、改造Get

先來改造Get



將希望處理的元素全部加進去:


五、改造Set

set方法有一個比較有意思的地方,在數組的操作中,每次都要能取出數組中的下一個元素,有點類似C#中的IEnumerator
使用時,需要將數組轉為 Enumerator 再調用 .next() 方法來獲取下一個值;
PS:這里有個特殊情況是 <select multiple>是可以直接用數組賦值的

function Enumerator(array) {
    if (array == null) {
        return;
    }
    let index = 0;
    this.next = function () {
        if (index >= array.length) {
            index = 0;
        }
        return array[index++];
    };
    this.all = function () {
        return array;
    };
}
// ...
let val = model[name];
if ($.isArray(val)) {
    val = model[name] = new Enumerator(val);
}
if (val instanceof Enumerator) {
    if (jq.is("select[multiple]")) {
        jq.val(val.all());
    } else {
        jq.val(val.next());
    }
}

但是這樣做會改變model對象中的值,所以需要先將model對象拷貝出來使用

function Copied(value) { Object.assign(this, value); }
// ...
const copied = model instanceof Copied ? value : Copied(value);

完整set代碼


demo

擴展JQuery.val demo - JSRUN

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Chapter 2 : Selecting the elements upon which to act 1. $...
    Azur_wxj閱讀 479評論 0 1
  • 一:認識jquery jquery是javascript的類庫,具有輕量級,完善的文檔,豐富的插件支持,完善的Aj...
    xuguibin閱讀 1,760評論 1 7
  • 1.JQuery 基礎 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,271評論 0 1
  • Map和Set --是ES6新增的兩個數據類型 --都屬于內置構造函數 既 使用new的方法來實例化 Set是一個...
    小胖子_d7d8閱讀 324評論 0 0
  • 1.JQuery 基礎 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,498評論 0 2

友情鏈接更多精彩內容