zoukankan      html  css  js  c++  java
  • JavaScript DOM编程艺术 读书笔记 第5章 最佳实践


    本章内容:
    平稳退化: 确保网页在没有JavaScript的情况下也能正常工作;
    分离JavaScript: 把网页的结构和内容与JavaScript脚本的动作行为分开;
    向后兼容性:确保老版本的浏览器不会因为你的JavaScript脚本而死掉;
    性能考虑: 确保脚本执行的性能最优。


    平稳退化

    网站的访问者完全有可能使用的是不支持JavaScript的浏览器, 还有一种可能是虽然浏览器支持JavaScript,但用户已经禁用它了(比如,因为讨厌看到弹出窗口)。
    以在新窗口中打开一个链接为例, (用户点击某个链接时弹出一个新窗口)
    正确的做法:
    <a href="http://www.baidu.com" onclick="popUp(this.href); return false">平稳</a>
    把href属性设置为真实存在的URL地址后,即使JavaScript已被禁用(或遇到了搜索机)。
    这个链接也是可用的。

    不足之处:每当需要打开新窗口时, 就不得不把一些JS代码嵌入标记文档中。
    如果能把包括事件处理函数在内的所有Js代码全部放到外部文件中, 这个技巧将更加完善。

    其中popUp函数是在另一个单独的js文件中
    function popUp(winUrl){
    window.open(winUrl,"popup", "width = 320, height = 480");
    }

    不好的做法:
    “javascript:”伪协议
    <a href="javascript:popUp("http://www.baidu.com");"></a>
    在HTML文档中通过“javascript:”伪协议调用JavaScript代码的做法非常不好。

    内嵌的事件处理函数: 将onclick事件处理函数作为属性嵌入<a>标签,把href属性的值设置为“#”只是为了创建一个空链接。
    <a href="#" onclick="popUp(this.href); return false">平稳</a>
    这个技巧和用伪协议调用js代码一样糟糕, 都不能平稳退化。 用户禁用了javascript功能,这样的链接毫无用处。

    改进平稳退化的技巧: 向CSS学习,结构和样式分离、渐进增强。

    渐变增强

    分离JavaScript

    在HTML文档中使用诸如onclick之类的属性也是一种既没有效率又容易引发问题的做法。

    JavaScript语言不要求事件必须在HTML文档中处理,我们可以在外部Javascript文件中把一个事件添加到HTML文档中的某个元素上:
    element.event = action…

    关键是如何确定应获取这个事件的元素 - 利用class或id属性来解决。

    function prepareLinks(){
    var links = document.getElementsByTagName("a");
    for(var i =0; i< links.length; i++) {
    if(links[i].getAttribute("class") == "popup"){
    links[i].onclick = function(){
    popUp(this.getAttribute("href"));
    return false;
    }
    }
    }
    }

    window.onload = prepareLinks();
    以上代码把调用popUp()函数的onclick事件添加到有关的链接标签上。
    将其存入外部js文件, 等于将其从HTML文档中分离出来, 这就是“分离JavaScript”的含义。
    var links = document.getElementsByTagName("a");这句代码在JavaScript文件被加载时立刻执行, 此时文档可能都没有开始加载或者加载完成。 没有完整的DOM, getElementByTagName等方法就不能正常工作。

    必须让这些代码在HTM文档全部加载到浏览器之后才开始执行。
    当window对象触发onload事件时, document对象已经存在。
    把prepareLinks函数添加到window对象的onload事件上,dom就可以正常工作了。
    window.onload = prepareLinks();

    在第6章, 介绍几种在文档加载时把事件添加到元素上的巧妙方法。

    向后兼容的方法
    对象检测, 检测浏览器对JavaScript的支持程度。 还不如说是方法检测呢。
    if(!document.getElementById) return false;
    和调用函数有一点点区别就是不需要带圆括号。

    浏览器的嗅探技术 , 已过时。

    性能考虑
    1. 减少访问DOM和尽量减少标记
    不管什么时候, 只要是查询DOM中的某些元素, 浏览器都会搜索整个DOM树, 从中查找可能匹配的元素。
    更好的方法是将第一次搜索的结果保存到一个变量中。

    2. 合并和放置脚本。
    包含脚本的最佳方式就是是使用外部脚本, 因为外部文件与标记能清晰地分离开, 而且浏览器也能对站点中的多个页面重用缓存过的相同脚本。
    <script src="script/funcaitonA.js"></script>

    如果有多个单独的js脚本, 建议合并到一个脚本, 这样可以减少加载页面时发送的请求数量。 (我理解应该是同一个页面有多个脚本的话合并到一起会好一些吧。)

    脚本在文档中放置的位置对初次加载时间也会有很大的影响。
    最好的做法是将<script>标签放到HTML文档的最后, </body>标签之前。 可以让页面变得更快, 而且在加载脚本时, window对象的load事件依然可以执行对文档进行的各种操作。

    一般来说,根据Http规范, 浏览器每次从同一个域名最多同时下载两个文件。 而在下载脚本期间,浏览器不会下载其它任何文件, 即使来自不同域名的文件也不会下载, 所以其它资源都要等脚本加载完毕之后才能下载。

    压缩脚本。
    多数情况下, 你应该有两个版本, 一个是工作副本,可以修改代码并添加注释; 另一个是精简副本,用于用在站点上。
    通常为了与精简版本区分开来, 最好在精简副本的文件名中加上min字样。

    JavaScript代码压缩工具:
    Douglas Crockford的JSMin
    雅虎的YUI Compressor
    Google的Closure Compiler

    本书里用到的一些方法


    Widow.open()
    JavaScript使用window对象的open()方法来创建新的浏览器窗口。
    这个方法有三个参数: window.open(url,name,features)
    这三个参数都是可选的
    Url - 在新窗口中打开的网页的URL地址。如果省略这个参数, 屏幕上将弹出一个空白的浏览器窗口;
    Name - 新窗口的名字。可以在代码里通过这个名字与新窗口进行通信;
    Features - 以逗号分隔的字符串, 其内容时新窗口的各种属性。 这些属性包括新窗口的尺寸(宽度和高度)以及新窗口被启用和金禁用的各种浏览功能(工具条、菜单条、初始显示位置,等等)。

    对于这个参数应该掌握一下原则:新窗口的浏览功能要少而精。
    P74

    window.onload
    P53
    P69

    Onload方法触发时, webview的onPageFinished()方法是这时候被回调的吗?查。

  • 相关阅读:
    支付宝沙箱环境应用
    七牛云视频托管
    腾讯云短息验证码接口
    git远程连接(码云)
    git
    字间距
    html文本保留空格
    mysql重启导致AUTO_INCREMENT从1开始
    js保留两位小数
    vue中watch的基本用法
  • 原文地址:https://www.cnblogs.com/huyang011/p/14265949.html
Copyright © 2011-2022 走看看