美文网首页js css htmljQuery
【JQuery】扩展 $.val()

【JQuery】扩展 $.val()

作者: 冰麟轻武 | 来源:发表于2023-01-07 22:39 被阅读0次

一、背景

公司的老项目前端还是用的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

相关文章

网友评论

    本文标题:【JQuery】扩展 $.val()

    本文链接:https://www.haomeiwen.com/subject/rliycdtx.html