【JQuery】擴展 $.val()

一峰锁、背景

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

image.png

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

二幽七、目標

html元素上使用name結(jié)構(gòu)化數(shù)據(jù)實體竟闪,
然后用val獲取整個實體离福,可以正確處理子對象和數(shù)組對象以及多選select
例如:

三炼蛤、修改方案

找到$().val的源碼妖爷;
會用jquery的同學(xué)都很清楚,val有2個邏輯鲸湃,不帶參是get赠涮,帶參是set
看源碼暗挑,有一個JQuery.valHooks 對象笋除,如果當(dāng)前元素可以匹配到則會直接調(diào)用valHooks中定義好的getset方法;
所以只要在這里加入我們定義好的元素和處理函數(shù)就可以了

四炸裆、改造Get

先來改造Get



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


五垃它、改造Set

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市土思,隨后出現(xiàn)的幾起案子务热,更是在濱河造成了極大的恐慌忆嗜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎岂,死亡現(xiàn)場離奇詭異捆毫,居然都是意外死亡,警方通過查閱死者的電腦和手機冲甘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門绩卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人江醇,你說我怎么就攤上這事濒憋。” “怎么了嫁审?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵跋炕,是天一觀的道長。 經(jīng)常有香客問我律适,道長辐烂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任捂贿,我火速辦了婚禮纠修,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厂僧。我一直安慰自己扣草,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布颜屠。 她就那樣靜靜地躺著辰妙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甫窟。 梳的紋絲不亂的頭發(fā)上密浑,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機與錄音粗井,去河邊找鬼尔破。 笑死,一個胖子當(dāng)著我的面吹牛浇衬,可吹牛的內(nèi)容都是我干的懒构。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼耘擂,長吁一口氣:“原來是場噩夢啊……” “哼胆剧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起醉冤,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赞赖,失蹤者是張志新(化名)和其女友劉穎滚朵,沒想到半個月后冤灾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體前域,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年韵吨,在試婚紗的時候發(fā)現(xiàn)自己被綠了匿垄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡归粉,死狀恐怖椿疗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糠悼,我是刑警寧澤届榄,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站倔喂,受9級特大地震影響铝条,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜席噩,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一班缰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悼枢,春花似錦埠忘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绰上,卻和暖如春旨怠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渔期。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工运吓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疯趟。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓拘哨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Chapter 2 : Selecting the elements upon which to act 1. $...
    Azur_wxj閱讀 392評論 0 1
  • 一:認識jquery jquery是javascript的類庫峡迷,具有輕量級幔托,完善的文檔鸟废,豐富的插件支持佩微,完善的Aj...
    xuguibin閱讀 1,714評論 1 7
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式旅敷。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性绞佩。 1....
    LaBaby_閱讀 1,181評論 0 1
  • Map和Set --是ES6新增的兩個數(shù)據(jù)類型 --都屬于內(nèi)置構(gòu)造函數(shù) 既 使用new的方法來實例化 Set是一個...
    小胖子_d7d8閱讀 151評論 0 0
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式癣亚。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性丑掺。 1....
    LaBaby_閱讀 1,346評論 0 2