为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不会再用 querySelector 了

JavaScript生态系统一直在不断发展,是时候迎接未来的一轮发展了。

我们都爱上了 jQuery 内置在浏览器里作为 document.querySelector()document.querySelectorAll()。这些方法使访问 DOM 更好。

最近,我有了一些经验,证明仅使用 document.querySelector()document.querySelectorAll() 是停留在过去,而错过了许多 Javascript 中的新特性。

使用 document.querySelector()document.querySelectorAll(),你无法解构 DOM,也无法一致地访问 DOM,但可以简化多个选择的过程,减少打字困难。现在让我们深入探讨,让你意识到你已经错过了什么。

但是等等!如果你还不太清楚 querySelector()querySelectorAll() 是什么,并且想要了解更多的话,可以看下面这个视频教程:JavaScript DOM 操作视频

方法不一致

document.querySelector()document.querySelectorAll() 在选择 DOM 元素时表现不同。一个方法选择目标元素的第一个实例,而另一个方法选择所有目标元素的实例。一个用于选择单个元素,另一个用于选择多个元素。

所以你不能随便混着用它们。你得根据需要来回切换。

    // 选择名为 .post 的第一个元素
    const post = document.querySelector('.post');

    // 选择所有名为 .post 的元素
    const posts = document.querySelectorAll('.post');

进入全屏 退出全屏

现在,我来给你展示一个更好的方法。最近创建了一个名为koras.jsx的UI库,它自带了一个$select()函数,可以用来替代JavaScript中的document.querySelector()document.querySelectorAll(),下面是它的用法示例。

//选择所有类为 .post 的元素
const posts = $select('.post');

//选择第一个 .post 元素
const firstPost = $select('.post')[0];

//使用 document.querySelectorAll 实现同样的功能

const posts = document.querySelectorAll('.post');
const firstPost = posts[0];

进入全屏,退出全屏

那有多酷!而且它正好能用在document.querySelector()document.querySelectorAll()这两种方法的用例上!

按索引选择

你可以在分组元素中选择任何一个。

    //选择第六个带有class为post的实例
    $select('.post[5]')

    //选择第七个div元素实例
    $select('div[6]')

全屏模式。退出全屏

删除项目

你可以用 $select() 来删除元素,比如说:

// Only delete the instance of .post with index of 2
$select('.post[delete|i=2]');

// Delete all instances of .post with index greater than 2 
$select('.post[delete|i>2]');

全屏模式,退出全屏

添加特性

你可以像这样给元素添加属性:
你可以使用 $select(),例如:

    $select('.post[add|class=hidden]'); // 选择具有hidden类的.post元素

    $select('.post[add|style=1px solid red]'); // 选择具有特定边框样式的.post元素

    $select('.post[add|id=2]'); // 选择具有特定ID的.post元素

    $select('.post[add|class=flex bold]'); // 选择具有flex和bold类的.post元素

全屏 全屏退出

您可以使用 $select() 来移除属性,例如:

$select('.post[remove|class=hidden]');

$select('.post[remove|id]');

$select('.post[remove|class=flex bold]');

$select('.post[remove|style]');

进入全屏|退出全屏

DOM 拆分

DOM 解构是 ES6 中的一个特性,但你可能意想不到的是,使用 document.querySelector()document.querySelectorAll() 选中的元素无法进行解构。

没用:

(暂无内容)

// 获取所有带有.post和.comment类的元素,并将其分为posts和comments两个数组

点击这里进入全屏 点击这里退出全屏

解法:
    const [posts, comments] = $select('.post, .comment');

全屏模式,退出全屏

你看得到吗?document.querySelectAll() 不支持 DOM 解构。这意味着你不能用解构的方式处理 DOM。不!这真的不行,所以你得开始用 $select()

重复的手段:

使用 document.querySelector()document.querySelectorAll() 导致代码重复,因为它们不支持 DOM 解构特性,这使得维护 JavaScript 代码有些麻烦。

这没用
    const [audio, posts, comments] = document.querySelectorAll(".audio, .post, .comment");

全屏模式:开启/关闭

所以你得做
    // 获取音频元素
    const audio = document.querySelector("#audio");

    // 获取所有帖子元素
    const posts = document.querySelectorAll(".post");

    // 获取所有评论元素
    const comments = document.querySelectorAll(".comment");

全屏,退出全屏

你看得出来有多重复吗,以及在大规模情况下维护代码库会有多混乱?

瞧瞧,你可以像下面这样很容易地用 $select() 做同样的事情:

解决办法
const [音频元素, 帖子元素, 评论元素] = $select("#audio, .post, .comment");

进入全屏模式 退出全屏

DOM选择调试难题:

与使用 $select() 相比,使用 document.querySelector() 更容易让 bugs 藏起来,这主要是因为它支持 DOM 解构特性以及多个选择。

const audio = document.querySelector("#audio");

const posts = document.querySelectorAll(".post");

const comments = document.querySelectorAll(".comment");

// 或

const [audio, posts, comments] = $select("#audio, .post, .comment");

// $select 用于选择指定的元素,这里选择了音频元素、帖子元素和评论元素。

全屏 退出全屏

$select()减少了选择元素所需的代码量,从而减少了错误潜藏的可能性。这意味着使用$select()时,错误更可能被更快地发现。

能搞定所有的数组方法。

通过 querySelector 获取的元素只能配合 forEach 使用,但不能与 map()filter() 等方法等等一起使用。

$select()默认与所有数组方法一起工作,而document.querySelectorAll()则需要一些变通方法。这些变通方法在大规模应用时可能会导致不必要的重复和复杂性。

维护性

可维护性总是围绕着易用性、简洁性和一致性。任何简洁、一致或易用的代码库通常都是可维护的。维护冗余和冗长的代码会很麻烦,因为你需要检查更多的内容,特别是在修复错误或构建功能时。

减少发送的:JavaScript

尽量减少JavaScript的加载是一个实用的经验法则,而 $select() 在处理DOM选择时使得这一点变得更容易实现。在大规模应用时,相比于 document.querySelector()document.querySelectorAll(),使用 $select() 更加简洁且减少了重复的选择。你选择的元素越多,使用 $select() 就越少重复选择。

在元素数组末尾添加或在前面插入:

你不能直接把由 $select() 生成的元素集合附加到另一个元素上,因为 DOM 需要的是一个 NodeList。

不过,你可以通过向 $select() 传递 false 作为第二个参数来禁用它的所有特性。

    //超能力默认是开启的,不过你可以传入 false 来关闭它。

     $select('.post', offSuperpowers);

     $select('.post', false);

点击全屏按钮或按F11全屏,再按一次或点击退出全屏 (点击全屏按钮或按F11全屏,再按一次或点击退出全屏)

现在,它将返回一个 DOM NodeList[],这个列表支持追加和前置操作。

$select() 可以做到这件事情

你可能想知道 $select() 是否能像 document.querySelector()document.querySelectorAll() 一样做所有事情。是的!它也能搞定它们所有的事。无论你是用 tag 还是 css 选择器, $select() 都可以完成 document.querySelector() 所有能做的事情。

document.querySelector()(这个函数)是不是真的更好呢?

可以说querySelector()或querySelectorAll()在平均情况下比$select()快大约一毫秒,但在大规模情况下,$select()则更胜一筹并弥补了之前的差距。

你还需要学习如何使用 querySelector,了解如何使用它,你就能构建一些有用的东西,就像用 $select() 一样。我能构建 $select() 是因为我真正了解它的运作原理。

我做了个教程,你可以看看。请参见下面:

JavaScript DOM

我为什么再也不想用 querySelector 了,

通过支持 DOM 解构和数组选择功能,$select() 成为我工具箱中的一个有用工具。它不仅使我的代码更易读,还减少了错误的发生,使调试过程更加简单。

为了可维护性、简洁性和一致性,$select() 是一个很好的选择,用于 DOM 选取,体现了 JavaScript 开发演进中的一步。

随着我们继续适应不断演变的 JavaScript 生态环境,使用类似 $select() 的工具可以确保使我们的代码更加简洁明了和易于维护。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消