Sun*_*Red 10 javascript jquery coding-style decoupling
通过设计,大多数jquery代码导致很多紧耦合,例如选择器假设html的特定结构
var mySubnav = $("#navigation a.sub-menu");
Run Code Online (Sandbox Code Playgroud)
如果相应的html发生变化,无论出于何种原因,
<a class="subMenu" .... </a>
Run Code Online (Sandbox Code Playgroud)
功能被打破了.
data-submenu="true",在html var mySubnav = $("[data-submenu]");上添加并在js端使用.$("a.sub-menu').也可以看看这可能不是一个流行的答案,但...测试,测试,测试.JQuery和Javascript通常是紧密耦合的,并且有充分的理由; 它们是在浏览器中运行的代码,因此您希望保持性能相对活泼.因此,注入允许更松散耦合的间接层会降低性能; 同样,它可能有点过分,因为在编写的JQuery/Javascript代码和它们为其编写的页面之间通常存在紧密的配对; 这同样是Javascript历史发展的一件神器,但这就是它的方式.因此,紧耦合非常"正常".
像任何紧耦合一样,处理这种紧耦合的方法是确保您已经有适当的测试来覆盖任何耦合故障.测试可以确保耦合是正确的,并且它确实是确保您期望的功能的最佳方式.
ui-specificGuy提供的 HTML
<div class="container grid8">
<ul class="ul1 horizontal">
<li>List Item 1</li>
<li>List Item 2</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
不好- 使用有针对性的类/钩子
$('.container.grid8').stuff();
$('.ul1.horizontal').moreStuff();
Run Code Online (Sandbox Code Playgroud)
调整 HTML
<div class="container grid8 ui-specificContainer">
<ul class="ul1 horizontal ui-specificList">
<li>List Item 1</li>
<li>List Item 2</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
好- 使用您自己的专用类/挂钩
$('.ui-specificContainer').stuff();
$('.ui-specificList').moreStuff();
Run Code Online (Sandbox Code Playgroud)
如果这能实现你的目标。
$('.ui-targetedElement')
Run Code Online (Sandbox Code Playgroud)
那为什么要有这样的选择器呢?
$('ul > li a.ui-targetedElement')
Run Code Online (Sandbox Code Playgroud)
这只是将不必要的 DOM 结构依赖项引入到您正在构建的功能中,您应该能够在这方面积极主动,因为此时您应该提供自己的钩子(前缀类),对吗?
最后,我想说,由于 DOM 和脚本一起工作的本质,DOM 和脚本之间的紧密耦合有时是不可避免的。