【发布时间】:2022-08-19 22:43:47
【问题描述】:
有哪些有用的方法可以创建类似 jQuery 的流畅界面?
有人recently asked 提出了类似的问题,但花更多的时间与那些试图提供帮助的人争论和侮辱,而不是改进问题。当那个关闭时,用户只是did it again。 (这两个问题都已关闭,查看它们需要一定的声誉等级。抱歉。)
然而,那里有一个非常有趣的问题。对于那些不熟悉的人来说,jQuery 是一个 JavaScript DOM 脚本库,曾经几乎无处不在,现在仍然很受欢迎。它有各种各样的功能,很多与此无关。但其核心是抽象 NodeLists 的选择并在其中的所有节点上进行 DOM 更改的概念。 jQuery 通常以名称$ 公开,典型代码可能如下所示1:
$ (\'.nav li:first-child a\')
.color (\'red\')
.size (2, \'em\')
.click ((evt) => {
evt .preventDefault ();
console .log (`\"${evt .target .closest (\'a\') .textContent}\" link clicked`)
})
请注意那里的流畅界面。节点被选中一次,然后函数color、size 和click 对每个匹配的节点执行。那么,问题是我们如何构建这样一个系统,允许我们编写color、size 和click 的简单版本,它们绑定在一个公共的链式接口中?
在其中一个问题结束之前,我编写了自己的版本,我将把它作为答案包含在内,用户@WillD 链接到a Fiddle,我希望它会成为另一个答案。
对于这个 pass,我建议我们不要试图模仿 jQuery 的其他部分功能,当然不是像 .ajax 或 $(document).ready(...) 这样的东西,但也不要打扰插件机制(除非它是免费的)或能够从当前的NodeList 生成一个新的NodeList。主要问题是如何将函数集合转换为从选择器生成节点集合的函数,并允许您将这些函数链接为该集合上的方法。
我会用我自己的方法添加一个答案,但我很好奇其他人会如何处理这个问题。
1这个库早于document.querySelector/querySelectorAll,我假设它是 DOM 方法的很大一部分灵感。
-
ping @WillD。您可以发布您的 Fiddle 代码作为答案吗?
标签: javascript jquery fluent