也谈分离JavaScript和HTML(转)
来源:互联网 发布:淘宝每天访客多少正常 编辑:程序博客网 时间:2024/06/05 01:55
转自:http://blog.csdn.net/eengel/article/details/6193209
不知道能不能将JavaScript和HTML的分离也归结为“你必将业务逻辑由显示中分离(thou shalt separate business logic from display)”[1]的问题。但有HTML和CSS的分离在前面对照,它们的分离是如此地优雅,对于理想主义的小coder实在具有莫大的吸引力。
从现实的角度,也可以举出很多方面来论证JavaScript和HTML分离的好处:网页设计人员和JavaScript程序员可以分工合作,尽可能降低沟通成本;当某些浏览器禁用JavaScript的时候不至于引起错误,提高网站的可访问性。
JavaScript和HTML分离的理想情况有两种:
1. JavaScript中无HTML
无法做到。DOM生来就是给JavaScript操作HTML的。JavaScript的两大功能:一是操作HTML,通过各种手段改变HTML页面外观;二是逻辑运算,随着富客户端的发展,JavaScript在这方面的运用也越来越多、越来越“正规”,甚至有如《JavaScript设计模式》[2]这样的书出来。
2. HTML中无JavaScript
这儿就从“为什么开发人员会把JavaScript代码放到HTML中去?”这个问题的角度进行分析。
最常见的。为HTML的节点添加事件。比如给一个按钮添加事件:当点击的时候弹出对话框。
(1)JavaScript和HTML紧密结合的做法:(本文所有的代码在Firefox3.6测过)
test.html
<!DOCTYPE HTML>
<HTML>
<HEAD></HEAD>
<BODY>
<input type="button" value="click me" onclick="alert('This is a button.');"/>
</BODY>
</HTML>
(2)将散乱的JavaScript抽象到函数中的做法:
test.html
<!DOCTYPE HTML>
<HTML>
<HEAD>
<script type="text/javascript">
function showMessage(){
alert('This is a button.');
}
</script>
</HEAD>
<BODY>
<input type="button" value="click me" onclick="showMessage();"/>
</BODY>
</HTML>
(3)JavaScript函数showMessage()似乎没必要待在.html文件中,扔到.js中去吧:
a.js
function showMessage(){
alert('This is a button.');
}
test.html
<!DOCTYPE HTML>
<HTML>
<HEAD>
<script type="text/javascript" src="/site_media/js/my/a.js" ></script>
</HEAD>
<BODY>
<input type="button" value="click me" onclick="showMessage();"/>
</BODY>
</HTML>
对比(1)的情况,(3)已经简洁很多。但想象一下,对于应用型的网站,这种需要加事件的HTML节点少则几十,多则上百,其维护和更新无论是对网页设计人员还是JavaScript开发人员都是一个沉重的负担。那如何才能将各节点上的onclick事件也“隐藏”起来?
来看看这些onclick的原理。当浏览器解析test.html的时候,遇到input按钮节点中有onclick的声明,则在对应的DOM树上加入此事件。因此当页面加载完毕后,一旦点击此按钮,对应的事件就可以被触发而弹出对话框。
一旦我们去除input上的onclick,
(4)首先,要在另外一个地方声明input的onclick事件,即a.js中的attachEvents()函数。
a.js
function attachEvents(){
document.getElementById("input1").onclick = showMessage;
}
function showMessage(){
alert('This is a button.');
}
但是,要怎么在HTML加载的时候触发attachEvents()呢,要知道,浏览器是不会主动执行.js中的JavaScript代码的。JavaScript代码需要放在HTML中,这样浏览器解析HTML时会执行包含的JavaScript代码。
可是我们并不想把attachEvents()函数放回到test.html中去,那就必须用到某些HTML与JavaScript的“关联”手段,而且这种关联必须在HTML中完成。
这种关联也是“为什么开发人员会把JavaScript代码放到HTML中去?”问题的一种原因。也就是在页面生命周期中的某些时刻触发特定的JavaScript语句/函数。用的最多的就是在页面加载完毕时对相关资源进行初始化,也就是window.onload。上面的例子,我们打算将attachEvents()函数放到HTML加载完成后执行,即:
test.html
<!DOCTYPE HTML>
<HTML>
<HEAD>
<script type="text/javascript" src="/site_media/js/my/a.js" ></script>
</HEAD>
<BODY>
<input id="input1" type="button" value="click me"/>
<script type="text/javascript">
window.onload = attachEvents;
</script>
</BODY>
</HTML>
注意,这儿JavaScript对input节点的操作是通过属性id来进行的。因此不需要在节点上显式地加入onclick属性和相应的JavaScript代码。这样,无论有多少节点需要加事件,都可以只修改a.js中的attachEvents()函数而不用管HTML页面。
另外,JavaScript对HTML节点的访问除了id之外还有其他方式。但对于事件关联,用的最多的还是id。因此网页设计人员在写HTML时,对有可能关联事件的节点添加id属性也是一个很好的习惯。
结论
理论上来说,除了<head>中包含.js文件的引用,以及在合适的地方添加类似window.onload的关联手段触发JavaScript代码的执行之外,其他形式的JavaScript混入HTML应该都可以避免。
当然,实际情况会比本文例子中的情况复杂得多,但上面的结论也可以作为参考,让JavaScript和HTML的分离更加理想。
参考文献
[1] Parr, T.J., Enforcing Strict Model-view Separation in Template Engines. WWW ’04: Proceedings of the 13th international conference onWorldWideWeb, New York, NY, USA, ACM Press (2004) 224–233, http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf
[2] JavaScript设计模式, http://book.douban.com/subject/3329540/
- 也谈分离JavaScript和HTML(转)
- 也谈分离JavaScript和HTML
- 也谈分离JavaScript和HTML
- 也谈分离JavaScript和HTML
- Javascript 与 HTML的分离
- HTML、css、JavaScript 代码分离
- HTML代码和PHP分离
- HTML代码和PHP分离
- javascript代码与html分离进阶
- 实现Javascript/css与HTML的分离
- Javascript二:如何实现Javascript/css与HTML的分离
- smarty手册 分离php和html
- html文件和js脚本分离
- javascript 利用onload 实现 js与html 彻底分离
- Javascript : 逻辑和代码的分离
- HTML 和 JavaScript 编程
- javascript和html区别
- javascript和html结合
- hp comprm CQ40 ubuntu无线驱动无法使用解决方案
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- java,android中的Math用法
- 日经社説 20150623 成長力を大きく高める戦略といえるか
- apkplug使用体验
- 也谈分离JavaScript和HTML(转)
- 人脸识别之特征脸方法(Eigenface)
- JAVA-2015-06-19应该思考的东西
- MySql语句大全:创建、授权、查询、修改等
- 社説 20150623 日韓50年式典 関係改善への転機にできるか
- android 限制广播消息的接收者
- Android Studio 解决引入java.awt.*以及javax.包问题的一种方法!
- Learning Spark 学习笔记 第四章 使用键/值对
- 社説 20150623 国会95日間延長 安保法案を確実に成立させよ