【发布时间】:2015-06-08 13:08:31
【问题描述】:
我一直在阅读有关 JavaScript 的一些好的做法,其中之一是 Unobtrusive JavaScript。第一点引起了我的注意
将功能(“行为层”)与网页的结构/内容和表示分离
在 wiki 页面上,其中一个示例是您应该将操作绑定到 JS 文件中的事件,而不是 HTML 中的事件。这个例子
<input type="text" name="date" id="date" />
...
window.onload = function() {
document.getElementById('date').onchange = validateDate;
};
优于
<input type="text" name="date" onchange="validateDate()" />
但是,我会说我更喜欢带有onchange 属性的第二个代码而不是第一个。我这样做的原因是
- 它易于阅读并立即清楚该元素的更改(或任何其他事件)会发生什么。
- 我不必通过 JavaScript 文件查看
onchange事件在哪里(以及是否)绑定,以及是否有一些其他事件,例如为#date定义的click。 - AngularJS 等框架具有
ng-click,并且正在将 HTML 结构与 JS 混合。为什么我不应该?
我读过的不使用不显眼的 javascript 的缺点是
- 污染全局命名空间。
- 创建冗长且不可读的内联代码。
- 如果事件的代码发生变化,您只需在一处进行更改 - 即在 JS 文件中。
但我认为缺点是可以解决的。
- 不要污染命名空间,而是在一个变量中创建应用程序,使代码看起来像
onchange="app.validateDate()"并且不会发生污染。 - 内联代码不会被写入,而是在 JS 文件中的一个函数中分离,然后像
onclick="app.action();"一样调用它。 - 不就是在
onclick属性中使用函数吗?因为最终您必须在两种方法中仅对一个函数进行更改,无论是$('input').change(function () {/* ... change ... */});还是app.action = function () {/* ... change ... */}。
那么它实际上仍然被认为是一种好的做法吗?
【问题讨论】:
-
我们将其分开的主要原因是因为这样,将来进行更改会容易得多。您不想更改 onChange 函数的名称,然后让 tyo 浏览所有 HTML 来更改它。您还希望人们能够在没有 javascript 的情况下使用您的网站,因此仅在有 javascript 的情况下将他们绑定是一种很好的做法。它还使您的代码更简单,因为您将所有内容分开。就像外部 CSS 文件更容易一样,您可以交换文件来更改样式,交换 JS 文件可以让您在交互方面做同样的事情。
-
此外,并非所有浏览器都为所有元素实现相同的事件。例如,您可能有特定于浏览器的实现。
-
最后,这也是一种很好的做法,因为它是常见的做法。任何其他开发人员会使用您的代码吗?他们知道会发生什么。这在很大程度上是一个约定。另请参阅:'第三,代码更像是您所说的“指南”,而不是实际规则。欢迎登机。' - 巴博萨船长
-
关于一致性,有些事情只有从JS代码中附加事件才能实现。因此,您将有两种处理事件的方法,一种将它们定义为属性,另一种将它们从 JS 代码附加 - 当您稍后尝试阅读代码和代码的一般设计时,不一致是很糟糕的。
-
虽然我同意第二个代码更短并且可能更好,但将 JavaScript 与 HTML 分开是更好的做法。想象一下,你在一个团队中工作,你只负责 JavaScript 编程。创建和编辑 HTML 文件的是其他人。还有其他人关心 CSS。通过分离关注点,每个团队都可以专注于自己的部分,而不会干涉其他团队的事务。
标签: javascript html angularjs