《JavaScript精粹(修订版)》——1.5 内容和行为的隔离(谨慎地编码)

简介: 不过使用load事件的问题是,在整个页面中只能使用一次;如果有两个或者更多的脚本需要通过load事件来执行,那么每个脚本都会改写对load事件的处理。解决方法是对load事件采用更好的响应方式,1.8节将继续探讨这个问题。

本节书摘来自异步社区《JavaScript精粹(修订版)》一书中的第1章,第1.5节,作者:【英】Edwards, J. , 【澳】Adams, C.著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.5 内容和行为的隔离(谨慎地编码)

将内容从行为中分离,意味着按照网页的结构分离出不同的层次来。Jeffrey Zeldman曾经将Web开发形容为“三条腿的板凳”1,分别是内容(HTML)、表示(CSS)、行为(JavaScript),他不仅指出三者在功能上的不同,同时也表明他认为这三者应该被互相隔离开来。

好的隔离方式将使得网站更容易维护,也更容易被理解和使用,同时对于老的或者支持特性较少的浏览器也能够提供相应的访问方式。

方 法
以下是一种极端情况,正好与理想的行为和内容互相分离的方法南辕北辙,也可以直接在事件处理属性中写入内嵌的代码。但这会把页面搞得一团糟,应该极力避免:

<div id="content" 
  onmouseover="this.style.borderColor='red'"
  onmouseout="this.style.borderColor='black'">

可以把完成这些工作的代码写成一个函数:

<div id="content"
  onmouseover="changeBorder('red')"
  onmouseout="changeBorder('black')">

定义一个函数来做这件事可以将大量的代码集中到一个单独的JavaScript文件中:

文件:separate-content-behaviors.js (excerpt)


function changeBorder(element, to)
{
  element.style.borderColor = to;
}

不过更好的方法是完全不使用内嵌的事件处理,而使用DOM(文档对象模型)来将事件处理绑定到HTML文档的元素中。DOM是一种标准的编程接口,它使得像JavaScript这样的语言可以直接访问HTML文档的内容,这也消除了出现在HTML文档中的JavaScript代码。HTML代码如下:

<div id="content">
JavaScript代码如下:

文件: separate-content-behaviors.js

function changeBorder(element, to)
{
    element.style.borderColor = to;
}

var contentDiv = document.getElementById('content');

contentDiv.onmouseover = function()
{
    changeBorder('this');
};

contentDiv.onmouseout = function()
{
    changeBorder('this');
};

这种方法允许增加、删除或者修改事件处理,而无需编辑HTML,而且,因为文档本身完全不依赖于这些脚本,所以那些不支持JavaScript的浏览器将丝毫不受影响。这种方法同时也增加了复用性,如果需要,也可以将相同的函数绑定到其他元素上,同样也不需要编辑HTML。

这种方法让我们拥有了通过DOM访问元素的能力,第5章将深入探讨DOM。
隔离的优点

通过将内容和行为分隔开来,不仅使代码具有更广泛的适用性,同时这种分而治之的思考方式也将带来好处。因为HTML和JavaScript完全分离,当我们检视HTML代码的时候,不会忘记这个页面需要显示的核心内容,而这些内容应当不依赖于任何脚本。

Andy Clark把这种方式叫做Web标准甜点2,这是一种有趣的类比,这种比喻方式认为一个好的网站设计应该是这样的:当看过去时,应该看到组成整个甜点的不同层次。这种方式的反面是水果蛋糕,您无法看到蛋糕的不同组成部分。您所能看到的就是搞不清什么材料的一块整个的蛋糕。
讨 论
当把事件处理和如下的元素绑定起来的时候,需要注意,只有在那个元素实际存在的时候才能那么做。如果把处理脚本放到页面的head区,浏览器会报告发生错误,然后拒绝执行代码,因为content div在这个位置还没有被浏览器解读显示,而JavaScript却已经先被处理了。

最直接的方法是把代码放到load事件处理中。这种方式最保险,因为load事件只有在整个页面已经完全载入的时候才会被激发:

window.onload = function()
{ 
 var contentDiv = document.getElementById('content');
┆
};

或者更清楚一点,多写一点代码:

window.onload = init;
function init()
{
 var contentDiv = document.getElementById('content');
┆
}

不过使用load事件的问题是,在整个页面中只能使用一次;如果有两个或者更多的脚本需要通过load事件来执行,那么每个脚本都会改写对load事件的处理。解决方法是对load事件采用更好的响应方式,1.8节将继续探讨这个问题。

相关文章
|
6月前
|
监控 JavaScript 前端开发
使用Vue.js开发员工上网行为监控的实时数据展示页面
使用Vue.js开发的实时员工上网行为监控页面,展示员工访问的网站、应用和时间等数据。页面响应式设计,适应不同设备。通过Vue组件显示实时数据,如`&lt;li v-for=&quot;activity in activities&quot;&gt;`循环渲染。数据定时更新,利用Vue的生命周期钩子和axios从服务器获取并自动刷新,确保数据的时效性。该页面有助于管理者即时了解员工网络活动,保障企业网络安全和资源管理。
199 5
|
7月前
|
JavaScript
阻止默认行为的两种方式(js的问题)
阻止默认行为的两种方式(js的问题)
42 0
|
6月前
|
JavaScript 前端开发 开发者
JavaScript的变量提升是一种编译阶段的行为,它将`var`声明的变量和函数声明移至作用域顶部。
【6月更文挑战第27天】JavaScript的变量提升是一种编译阶段的行为,它将`var`声明的变量和函数声明移至作用域顶部。变量默认值为`undefined`,函数则整体提升。`let`和`const`不在提升范围内,存在暂时性死区。现代实践推荐明确声明位置以减少误解。
48 2
|
2月前
|
JSON 监控 JavaScript
Logo/JS 在局域网行为管理软件中的探索之路
在数字化时代,局域网行为管理软件对企业至关重要,Logo 和 JavaScript 在其开发中发挥重要作用。Logo 用于绘制网络拓扑图,帮助管理员了解网络结构;JavaScript 实现实时监控网络流量和用户行为分析,提升管理效率和安全性。
36 3
|
5月前
|
监控 JavaScript 安全
局域网行为管理软件与 Angular.js 的协同工作
在数字化办公时代,局域网行为管理软件对保障企业信息安全至关重要。Angular.js 作为强大前端框架,助力这类软件开发与优化。通过 `$http` 服务收集并提交用户行为数据至服务器,实现实时监控与展示。Angular.js 提供的双向数据绑定特性增强了软件交互性与实用性,为企业提供高效可靠的行为管理方案,保障网络安全与正常运营。
32 6
|
4月前
|
JavaScript 前端开发
JS - 如何上传 Base64 编码的图片
本文展示了如何将Base64编码的图片在前端转换为Blob对象,并使用`FormData`上传到服务器端的方法。
206 0
|
5月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
61 1
|
5月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
60 1
|
5月前
|
JavaScript 前端开发 索引
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
49 1
|
6月前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作