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

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节将继续探讨这个问题。

时间: 2024-08-04 01:55:19

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

《JavaScript精粹(修订版)》——1.3 JavaScript的最佳实践

1.3 JavaScript的最佳实践 JavaScript实践遇到的一个最大的问题是,如果用户的浏览器根本就不支持JavaScript怎么办?如果用户关掉了浏览器对JavaScript的支持呢?再或者因为某些原因,用户使用了别的不支持JavaScript的技术怎么办? 这个问题一言难尽,第16章将详细讨论解决方法.下面提出3条写好JavaScript代码的原则: 渐进增强. 为那些没有安装JavaScript的用户着想: 谨慎地编码. 内容和行为的隔离: 一致的编码方式. 使用括号和分号结束符

《JavaScript精粹(修订版)》——导读

**前言**对很多人来说,提起JavaScript,常常伴随着很多不愉快的记忆,例如讨厌的弹出式窗口.恼人的鼠标尾迹,还有令人沮丧的禁止鼠标右键的脚本.如果常常遇到这些脚本,就知道那是多么乏味和无聊.不过,JavaScript确实是一种成熟.专业的脚本语言,广泛地应用于现在的大多数网站,而且,它也几乎是所有基于Web的应用程序的关键性组件.别奇怪,我们确实是在谈论同一种技术. 当然,回顾过去,我认为很多人对JavaScript的感受还是比较准确的:JavaScript确实名声不太好,随着大量网站

JavaScript使表单中的内容显示在屏幕上的方法

  本文实例讲述了JavaScript使表单中的内容显示在屏幕上的方法.分享给大家供大家参考.具体实现方法如下: 一.使内容水平出现 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <html> <head> <title>测试</title> <script type="text/javascript"> function to() { var txt=document.getElement

通过Javascript读取本地Excel文件内容的代码示例

 这篇文章主要介绍了通过Javascript读取本地Excel文件内容的代码示例,但需要一定的条件才可以使用js操作本地文件,需要的朋友参考下吧 读取本地Excel文件内容的Javascript代码:    代码如下: <script type="text/javascript"> function read_excel(){       var filePath="D:abcd9.com.xls"; //要读取的xls     var sheet_id

用JavaScript获取页面文档内容的实现代码_javascript技巧

JavaScript的document对象包含了页面的实际内容,所以利用document对象可以获取页面内容,例如页面标题.各个表单值. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js基础</title> </head> <body> <p>一. 用Documen

JavaScript实现解析INI文件内容的方法_javascript技巧

本文实例讲述了JavaScript实现解析INI文件内容的方法.分享给大家供大家参考,具体如下: .ini 是Initialization File的缩写,即初始化文件,ini文件格式广泛用于软件的配置文件. INI文件由节.键.值.注释组成. 根据node.js版本的node-iniparser改写了个JavaScript函数来解析INI文件内容,传入INI格式的字符串,返回一个json object. function parseINIString(data){ var regex = {

javascript实现框架高度随内容改变的方法_javascript技巧

本文实例讲述了javascript实现框架高度随内容改变的方法.分享给大家供大家参考.具体如下: 有两种方法: 一.就是通过父页面改变 这里要理解框架的两个属性 contentWindow 和contentDocument 两个属性的意思和window document意思差不多,不同的是contentWindow 所有浏览器都支持,contentDocument   ie6,7不支持,chrome 也不支持 <iframe onload="change_height()">

JavaScript动态修改网页元素内容的方法_javascript技巧

本文实例讲述了JavaScript动态修改网页元素内容的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码当用户点击提交按钮后,通过元素的textContent或者innerHTML动态指定元素的内容 <script type="text/javascript"> function showCard() { var message = document.getElementById("CCN").value; var element = docu

《JavaScript精粹(修订版)》——1.10 脚本调试

1.10 脚本调试 调试是一个查错改错的过程.绝大多数浏览器拥有内建的报告错误的功能,还有一些外部的调试工具也值得关注. 1.10.1 理解浏览器内建的错误报告 Opera.Mozilla浏览器(例如FireFox)以及Internet Explorer都拥有很好的内建的错误报告功能,不过Opera和Mozilla的调试工具最为有用. (1)Opera. 通过菜单Tools→Advanced→JavaScript console可以打开JavaScript控制台.也可以把它设置为遇到错误的时候自