读《编写可维护的JavaScript》第五章总结

第五章 UI层的松耦合

5.1 什么是松耦合

在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的:

  • HTML是用来定义页面的数据和语义
  • CSS用来给页面添加样式
  • JavaScript用来给页面添加行为

我们的目标:确保对一个组件的修改不会经常性地影响其他部分。

结果:

  1. 遇到和文本或结构相关的问题,通过查找HTML即可定位
  2. 当发生了样式相关的问题,你知道问题出现在CSS中
  3. 对于那些行为相关的问题,你直接去JavaScript中找到问题所在

5.2 将JavaScript从CSS中抽离

IE8和更早版本的浏览器有一个特性:CSS表达式(CSS expression)。(读者本人看了此书才知道- -)

它的特点是:允许你将JavaScript直接插入到CSS中。然而历史中毕竟是有糟粕的。

一句话:杜绝使用

5.3 将CSS从JavaScript中抽离

这个读者本人就经常见了。。一些只是把JS当做脚本语言的后端人员会经常性的这样写。

        // 不好的写法
        element.style.color = "red";
        element.style.left = "10px";
        element.style.top = "100px";
        element.style.visibility = "visibility";

然而最佳操作的方法是 操作CSS的className

        // 好的写法 - 原生方法
        element.className +=" reveal";

        // 好的写法 - HTML5
        element.classList.add("reveal");

        // 好的写法 - YUI
        Y.one(element).addClass("reveal");

        // 好的写法 - jQuery
        $(element).addClass("reveal");

        // 好的写法 - Dojo
        dojo.addClass(element, "reveal");

理由:由于CSS的className可以成为css和JavaScript之间通信的桥梁,在页面的生命周期中,JS可以随意添加和删除元素的className而不必直接操作样式,以便保持和CSS的松耦合。

5.4 将JavaScript从html抽离

① 这个部分也是老生常谈了。。估计很少有人现在这样写了吧。。

<button onclick="doSomething()" id="action-btn">Click me</button>

作者推荐的,也是众多书中有的写法:

        function doSomething() {
            // 代码
         }
        var btn = document.getElementById("action-btn");
        btn.addListener(btn, "click", doSomething);

IE8以及早期版本浏览器不支持addEventListener()函数,因此你需要一个标准的函数将这些差异性做封装。

       function addListener(target, type, handler) {
            if (target.addEventListener) {
                target.addEventListener(type, handler, false);
            } else if (target.attachEvent) {
                target.attachEvent("on" + type, handler);
            } else {
                target["on" + type] = handler;
            }
        }

如果你用了JavaScript类库,可以使用类库提供的方法来给元素挂载事件处理程序。这里给出了一些流行的类库的示例代码。

        // YUI
        Y.one("#action-btn").on("click", doSomething);

        // jQuery
        $("#action-btn").on("click", doSomething);

        // Dojo
        var btn = dojo.byId("action-btn");
        dojo.connect(btn, "click", doSomething);

 ②  另外,作者本人也不推荐使用<script>标签方式包含JavaScript代码(不过在紧急调试时这仍然是一种好办法,正式环境当然隔离好了!)

5.5 将HTML从JavaScript中抽离

作者将重头戏放到了最后,我在做上一个项目的时候,采取的拼html方式。这种方式不用说,很low。类似于以下这种的:

你会发现需要转义,HTML和JS混在一起,如果要修改的话需要修改多处,所以,作者推荐了三种方式将HTML从JavaScript中抽离:

5.5.1 方法1 :从服务器加载

这种方法是将模板置于远程服务器,然后用Ajax技术去取,方法类似于下面的:

// YUI
function loadDialog(name, oncomplete) {
    Y.one("#dlg-holder").load("js/dialog" + name, oncomplete);
}

// jQuery
function loadDialog(name, oncomplete) {
    $.one("#dlg-holder").load("js/dialog" + name, oncomplete);
} 

当你需要注入大段不经常改变的HTML代码到页面中时,这种方式是非常有帮助的。对于少量的标签段,你可以考虑采用客户端模板。

PS: 本人感觉这种方法也low- -因为作者本人后面加了一句:出于性能原因,将大量没用的标签放入内存或DOM中是很糟糕的做法。这也就直接说明了这种方式并不适合动态模板。

5.5.2 方法二:简单客户端模板

客户端模板是一些带“插槽”的标签片段,这些插槽会被JavaScript程序替换为数据以保证模板的完整可用。

// 这段模板包含%s占位符,这个位置的文本会被程序替换掉<li><a href="%s">%s</a></li>

本质上讲,我们不希望在JavaScript中嵌入模板文本,那放哪呢?作者提供了俩种方法。

  • 在HTML注释中包含模板文本。
        <ul id="mylist">
            <%--<li><a href="%s">%s</a></li>--%>
        </ul>
  • 或者是带自定义type属性的<script>元素,浏览器会默认将<script>元素的内容识别为JavaScript代码,但你可以通过给type赋值为浏览器不识别的类型,从而来告诉浏览器这不是一段JavaScript脚本。

        <script type="text/x-my-template" id="list-item">
            <li><a href="%s">%s</a></li>
        </script>

一旦取出了模板,剩下的事就好办了,用JS把每个%s替换成数据就OK了~。

PS:此方法和上面的方法都是针对简单格式的,并无太多转义,我偏好傻瓜式的作者推荐的方法三(第三方插件),它提供的成熟的解决方案大大方便了程序员。

5.5.3 方法三:复杂客户端模板

如果你想用一些更健壮的模板,可以考虑诸如Handlebars所提供的解决方案。

具体可以去它的官网上查看。非常强大,功能也五花八门的。

PS:本人还木有接触关于前端框架的东东。。只是听微雨惊尘老师说,前端框架自带解决这个问题的功能,希望自己可以尽快接触~

时间: 2024-08-09 21:58:51

读《编写可维护的JavaScript》第五章总结的相关文章

[已读]编写可维护的javascript

13年4月份出版,作者是大名鼎鼎的Zakas,他的另两本书<javascript高级程序设计>与<高性能javascript>你一定听过或者读过. 这本书重点讲了编码风格和编码规范,各种检测(非空.类型.属性.是否存在.原型)还有一些小tips.当然,它提到了用in做存在检测,因为可排除一些特殊情况,比如值本身为假植.但是实际上,我们在写代码的时候,还是会简单得使用属性检测,因为in总是会比较耗时.另外,它花了40%的篇幅讲解自动化.第一次看的时候云里雾里,自动化这一部分基本上被我

《编写可维护的javascript》读书笔记(上)

最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. 1.缩进:一种是利用制表符缩进,一种是使用空格符缩进,各有利弊,任选一种,保持一致即可.个人比较喜欢制表符缩进. 2.语句结尾需要加上分号,避免没必要的BUG. 3.命名:首先要语义化,使用驼峰式命名法,小驼峰即首字母小写,之后每个单词首字母大写:大驼峰即首字母大写,之后同小驼峰:变量名前缀应该是名词(my

编写可维护的JavaScript之简易模版

/* * 正则替换%s * @para arg1(text) 需要替换的模版 * @para arg2 替换第一处%s * @para arg3 替换第二处%s * 返回替换后的字符串 */ var sprintf = function (text) { var i = 1, args = arguments, len = args.length; return text.replace(/%s/g, function () { return (i < len) ? args[i++] : &quo

编写可维护的JavaScript之事件处理

规则1:隔离应用逻辑 这会让你的代码容易调试 规则2:不要分发事件对象 event对象包含了太多信息 // a good example var handlePopup = { // 事件句柄,处理所有和event对象有关的东西 handleClick: function (e) { // 假设事件支持DOM Level2 e.preventDefault(); e.stopPropagation(); // 传入应用逻辑 this.showPopup(e.clientX, e.clientY)

《编写可维护的javascript》读书笔记(中)——编程实践

上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. 二.编程实践 1.UI松耦合 第一.将css从javascript中抽离(要改变dom样式数据,应该去操作dom的class名而非dom的style属性,后续要修改此样式只需到对应的css文件中修改而不用修改js文件): 第二.将javascript从HTML中抽离,比如下面的写法是不好的 <!-- 不

读《编写可维护的javascript》笔记

第一章 基本的格式化 缩进层级:推荐 tab:4; 换行:在运算符后面换行,第二行追加两个缩进: // Good: Break after operator, following line indented two levels callAFunction(document, element, window, "some string value", true, 123, navigator); // Bad: Following line indented only one leve

《编写可维护的Javascript》总结

最近读了这本书,为了防止狗熊掰棒子式的学习,写这篇总结把收获沉淀下来. 先说说看书的一点感受吧.不要说在大公司中多人团队合作了,就连原来在实验室的几个人小规模开发也都很需要编码规范,否则当复用组件的时候就要花费大量的时间调试,甚至不得不更改原来的代码.多人协作所需要制定的代码规范,常常就是大家达成协议要缩进几个格.如何命名等这些编程风格.虽然这个也很重要,统一风格有助于别人读懂和维护代码,而我认为更重要的是减少对他人代码的污染,同时减少重复的逻辑,能够实现代码的复用.再往上走,更高级和智能的应该

读《构建之法》第五章

第五章说的是团队和流程, 什么是团队? 团队有一致的集体目标,团队要一起完成这目标,一个团队的成员不一定要同时工作,例如接力赛跑. 团队成员有各自的分工,互相依赖合作,共同完成任务. 软件团队有许多模式,例如:: 主治医生模式 明星模式 社区模式 业余剧团模式 秘密团队 特工团队 交响乐队模式 爵士乐模式 功能团队模式 官僚模式 开发流程: 写了再改模式 瀑布模型 瀑布模型的各种变形 Rational Unified Process统一流程(RUP) 老板驱动的流程 渐进交付的流程

读《编写可维护的JavaScript》第六章总结

第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载并等同于全局对象,因此任何在全局作用域声明的变量和函数都是windows对象的属性. 6.1 全局变量带来的问题 这个就不用照着书详谈了,当我们进入团队合作编写代码时,若大家自定义的变量都是直接挂载在windows对象上(也就是全局变量),很容易发生命名冲突.像这样: function sayCol