JS 20 - HTML 字串算什麽,教你用 CSS 选择器建立网页元素!

大家好!

昨天我们建立了 insert 方法,今天我们就要延伸它的用法。
我们进入今天的主题吧!


前言

$('<button>Submit</button>');
$('<button id="submit" type="submit" disabled>Submit</button>');

如果要使用 jQuery 来建立元素时,我们会使用第一行的方法。
但是,如果元素有很多属性的话,不就会像第二行的方法一样很冗长吗?
没错,接下来我们就要实作既省时又不冗长的静态方法。


实作

Felix.create = function (str, content) {
    /* 拆解 CSS 选择器 */
    var blank = str.split(/(?=[#.][\w-:]+)|(?=\[[a-z][\w-:]+(?:=".+")?\])/);
    /* 根据标签名或预设值建立元素 */
    var el = document.createElement(/^[\w-:]+$/.test(blank[0]) ? blank.shift() : 'div');
    blank.forEach((v) => {
        /* 解析拆解後的选择器 */
        var model = v.match(/#([\w-:]+)|\.([\w-:]+)|\[([a-z][\w-:]+)(?:="(.+)")?\]/);
        /* 识别解析後的选择器 */
        if (model[1]) el.id = model[1];
        else if (model[2]) el.classList.add(model[2]);
        else if (model[3]) el.setAttribute(model[3], model[4] || '');
    });
    if (content) {
        var type = content instanceof HTMLElement ? 'Element' : 'HTML';
        el['insertAdjacent' + type]('beforeend', content);
    }
    return el;
};

最後,再将昨天的 insert 改良一下:

Felix.prototype.insert = function (el, content, pos) {
    el = typeof el === 'string' ? Felix.create(el, content) : el;
    pos = /^(before|after)(begin|end)$/.test(pos) ? pos : 'beforeend';
    Felix.forEach(this, function () {
        this.insertAdjacentElement(pos, el);
    });
    return el;
};

使用方法请见下方的样本。


实测

我们来比较 jQuery 和 Felix 建立物件的效率吧!
先附上样本:

/* jQuery */
$('body').append('<button id="submit" type="submit" disabled>Submit</button>');

/* Felix */
Felix('body').insert('button#submit[type="submit"][disabled]', 'Submit');
# jQuery Felix Winner
01 0.48511 ms 0.53809 ms jQuery
02 0.33594 ms 0.34668 ms jQuery
03 0.46191 ms 0.25488 ms Felix
04 0.43604 ms 0.16406 ms Felix
05 0.51001 ms 0.24072 ms Felix
06 0.34180 ms 0.15820 ms Felix
07 0.37964 ms 0.20410 ms Felix
08 0.37598 ms 0.17725 ms Felix
09 0.42871 ms 0.37402 ms Felix
10 0.45386 ms 0.24194 ms Felix
Total 4.20900 ms 2.69994 ms Felix

结果是 Felix 成功胜出!


解析 HTML 字串需要一定时间(Element.innerHTMLElement.insertAdjacentHTML),因此执行时间就会比较长;然而,使用 CSS 选择器只要操作正规表示式,耗费的时间自然也会较少。

差不多也到尾声了,接下来我们要介绍的是函式库的静态方法。
如果对文章有任何疑问,也欢迎在下方提问和建议!
我是 Felix,我们明天再见!


<<:  创建App-厂商合作提案

>>:  Day 20 资料库评估 - Database Assessment (sqlmap, SQLite database browser)

[Day 18] Migration

当多人一起开发专案时,Migration可以让团队修改、设定资料库的内容,像是资料库的版本控制,会纪...

DAY3:离职率预测(下)

人工智慧共创平台-离职率预测(下) 资料清洗 ax = sns.countplot(x="...

试着掌握潜在客户需求

知己知彼,百战百胜,在开始与客户洽谈之前,我们必须要尽可能地搜集客户的资料,才能为他们提供更好的规划...

RISC-V: Jump 指令

JUMP! 没有其他选择,执行到这就一定得跳! 这次有两种不同格式的指令,分别是 J-type 的 ...

Day18 vue.js新增文章

延续昨日 今天我们来新增专案 首先需要先新增一个Addproject.vue 新增path 以及修改...