JavaScript DOM 高级程序设计 第1章 遵循最佳实践 摘记

本书探讨了JavaScript在网页交互中的角色变迁及最佳实践,包括代码组织、事件绑定、模拟命名空间等技术要点。

原书详情:

桑贝斯. JavaScript DOM高级程序设计[M]. 人民邮电出版社, 2008.

首先说一下我的亲身感觉,时代在进步,这本书中的观点其实已经和现在的一些观点起冲突了,比如本书一直在倡导的:

JavaScript是用来增强与用户的交互的.

注意,是增强,不是完成,所以需要保证,即使浏览器禁用JavaScript,网页也能正常交互.但是看看现在,Node.js还有React.js,JavaScript的作用不再是简单的增强交互.套用一句话,鬼知道JavaScript之后能做到什么程度.所以针对本书的内容,我不会全盘引用,而是有针对性的摘录一些.

至于为什么要刷这本书,是因为被老大喷,JavaScript基础这么差,去学什么高深的东西,先把底子打好,于是就开始刷这本书了.今天才刷了第一章,大大感叹自己底子是真的差.

第1章 遵循最佳实践

1.1 不唐突和渐进增强

没什么内容,可以直接忽略.

1.2 让JavaScript运行起来

最好不要使用内嵌式的将js代码写在网页中,而是写在一个一个js文件中,在需要时进行引用.

不要在超链接中使用如下形式的js调用:

  • <a href='javascript:window.location.href="#"'>这里超链接是使用js实现的</a>
  • <a hre="" onclick="functionName">这里在标签内部绑定了JS点击事件</a>

而是使用classid进行事件绑定.

不要进行版本检测,常说要兼容各种浏览器,我是没有实际操作过,毕竟我是伪前端,书上的意思是不要针对各种浏览器做不同的处理,而是检测该浏览器是否支持该操作,如果支持,则运行该效果,如果不支持,则宁可直接放弃该效果.

模拟命名空间

这里直接贴一段代码:

(function(){
    // 如果已有对命名空间 ADS 的占用,则清除该占用
    if(!window.ADS){
        window['ADS`]={}
    }
    // 定义一个函数,并将其保存进文档ADS命名空间下,名字就叫做function1
    function function1(){}
    window['ADS']['function1']=function1;
    // 这里也是
    function function2(){}
    window['ADS']['function2']=function2;
})()

假设上述代码都保存在一个名为ADC.js的文件中,当你想调用其中的function1时,只需两步:

  • 在页面中引入ADC.js
  • 以如下方式进行调用ADC.function1()

这样的调用形式从外部看来,仿佛是调用在ADC命名空间下的function1函数.

该部分剩下的内容就是对其中函数的扩充,很有价值,而且是循序渐进的,很适合小白看.稍后我会把PDF版以百度云的形式分享出来的.

1.3 JavaScript语法中常见的陷阱

  • 区分大小写
  • 单引号和双引号

这里其实是我一直用错的地方,详细介绍一下:

var html='<a href="index.php">注意,是在单引号中嵌入双引号</a>';

以前一直是在双引号中嵌入单引号.....

其遵守的规则如下:

  • 所有HTML属性值必须使用双引号括起来,比如a的href属性

另外还有一点,同样是上面的拼接html字符串,如果要换行,就使用字符串拼接的方式,这样能保证即使被第三方库编译也不会出错.

还有一点,JavaScript其实不强制要求你一定要写;,比如下面的代码是能正确运行的:

alert(1)
alert(2)
alert(3)

但是最好还是写上,有一句名言:

要记住,维护你代码的人是个精神容易崩溃,且知道你家地址的人.

重载,JavaScript不支持重载,同一个名称的函数,js不会按照你传入参数的不同就调用不同的函数,相反,js会直接调用最后的函数,简单来说就是覆盖.

函数作用域

这个很重要!!!

先来看这段例子:

<div id="1">1</div>
<div id="2">2</div>
<div id="3">3</div>
<script type="text/javascript">
    for(var i=1;i<3;i++){
        var divObject=document.getElementsById(i);
        divObject.addEventListener('click',function(){
            alert(i);
        });
    }
</script>

这里为每一个div绑定了一个单击事件,希望能输出不同的弹框,但是事实是,每一个div输出的弹框都是一致的,都是3,至于原因,就是作用域,每个div绑定的是事件都是一个匿名函数(闭包函数):

function(){
    alert(i);
}

但是注意,在闭包函数中并没有定义参数i,参数i属于其上级函数,所以当该闭包函数找不到参数i时,就向上级去寻找,那时i由于for函数已经递增到3了,所以每个div点击后弹出的都是3.

这里要说明的是:当一个函数内部调用某个未在函数内部定义的参数时,就会向上去寻找.

迭代对象,简单来说就是当我们迭代

var divObjects=document.getElementsByTagName('div');

这样形式的返回值时,返回值的类型是NamedNodMap对象,可以像操作数组一样对其进行遍历,但是当使用遍历的另一种形式时,就会出现另外的参数:

页面源码:

<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>

js代码如下:

var divObjects=document.getElementsByTagName('div');
for (i in divObjects){
    console.log(divObjects[i]);
}

运行结果:

这里写图片描述

其中会多出来几个参数:length,item,namedItem,这几个参数都是NamedNodeMap对象附加的几个参数,由于for函数被调用到了.

要想去除掉这几个参数可以使用如下的调用形式:

var divObjects=document.getElementsByTagName('div');
for( i in divObjects ){
    // 筛选掉额外元素
    if(!divObjects.hasOwnProperty(i)){
        continue;
    }
    // 这里就是div对象了
    console.log(divObjects[i]);
}

关于hasOwnProperty()的介绍.

文件原文下载地址

文件扫描版百度云下载地址:

链接: https://pan.baidu.com/s/1geBMG0N 密码: 5wcc

第一部分 深入理解DOM脚本编程  第1 遵循最佳实践    1.1 不唐突和渐进增强    1.2 让JavaScript运行起来     1.2.1 把行为从结构中分离出来     1.2.2 不要版本检测     1.2.3 通过平稳退化保证可访问性     1.2.4 为重用命名空间而进行规划     1.2.5 通过可重用的对象把事情简化     1.2.6 一定要自己动手写代码    1.3 JavaScript语法中常见的陷阱     1.3.1 区分大小写     1.3.2 单引号与双引号      1.3.3 换行     1.3.4 可选的分号和花括号     1.3.5 重载(并非真正的重载)     1.3.6 匿名函数     1.3.7 作用域解析和闭包     1.3.8 迭代对象     1.3.9 函数的调用和引用(不带括号)    1.4 实例:WYSIWYGJavaScript翻转图    1.5 小结   第2 创建可重用的对象    2.1 对象中包含什么     2.1.1 继承     2.1.2 理解对象成员     2.1.3 window对象中的一切     2.1.4 理解作用域和闭包是根本    2.2 创建你自己的对象     2.2.1 一变多:创建构造函数     2.2.2 添加静态方法     2.2.3 向原型中添加公有方法     2.2.4 公有、私有、特权和静态成员真那么重要吗     2.2.5 对象字面量    2.3 this是什么    2.4 try{}、catch{}和异常处理    2.5 实例:你自己的调试日志     2.5.1 为什么需要JavaScript日志对象     2.5.2 myLogger()对象    2.6 小结   第3 DOM2核心和DOM2 HTML    3.1 DOM不是JavaScript,它是文档    3.2 DOM的级别     3.2.1 DOM 0 级     3.2.2 DOM 1 级     3.2.3 DOM 2 级     3.2.4 DOM 3 级     3.2.5 哪个级别适合你    3.3 创建示例文档     3.3.1 创建DOM文件     3.3.2 选择一个浏览器   3.4 DOM核心     3.4.1 继承在DOM中的重要性     3.4.2 核心Node对象     3.4.3 核心Element对象     3.4.4 核心Document对象     3.4.5 遍历和迭代DOM树    3.5 DOM HTML     3.5.1 DOM2 HTML 的HTMLDocument对象     3.5.2 DOM2 HTML 的HTMLElement对象    3.6 实例:将手工HTML代码转换为DOM代码     3.6.1 DOM生成工具的HTML文件     3.6.2 使用示例HTML片段进行测试     3.6.3 扩充ADS库     3.6.4 generateDOM对象的框架    3.7 小结   第4 响应用户操作和事件    4.1 DOM2级事件    4.2 事件的类型     4.2.1 对象事件     4.2.2 鼠标移动事件     4.2.3 鼠标单击事件     4.2.4 键盘事件     4.2.5 表单相关的事件     4.2.6 针对W3C DOM的事件     4.2.7 自定义事件    4.3 控制事件流和注册事件侦听器     4.3.1 事件流     4.3.2 注册事件     4.3.3 在事件侦听器中访问事件对象     4.3.4 跨浏览器的事件属性和方法    4.4 小结   第5 动态修改样式和层叠样式表    5.1 W3CDOM2样式规范     5.1.1 CSSStyleSheet对象     5.1.2 CSSStyleRule对象     5.1.3 CSSStyleDeclaration对象     5.1.4 支持的匮乏    5.2 当DOM 脚本遇到样式    5.3 把样式置于DOM脚本之外     5.3.1 style属性     5.3.2 基于className切换样式     5.3.3 切换样式表     5.3.4 修改CSS规则    5.4 访问计算样式    5.5 Microsoft的filter属性    5.6 实例:简单的渐变效果    5.7 小结   第6 案例研究:图像裁剪和缩放工具    6.1 测试文件    6.2 imageEditor对象     6.2.1 调用imageEditor工具     6.2.2 imageEditor载入事件     6.2.3 创建编辑器标记和对象     6.2.4 向imageEditor对象添加事件侦听器     6.2.5 缩放图像     6.2.6 裁剪图像     6.2.7 未完成的图像编辑器    6.3 小结  第二部分 浏览器外部通信  第7 向应用程序中加入Ajax    7.1 组合的技术     7.1.1 语义化XHTML和DOM     7.1.2 JavaScript和XMLHttpRequest对象     7.1.3 XML     7.1.4 一个可重用的对象     7.1.5 Ajax是正确的选择吗    7.2 为什么Ajax会破坏网站及如何解决     7.2.1 依赖JavaScript生成内容     7.2.2 通过script标签绕过跨站点限制     7.2.3 后退按钮和书签功能     7.2.4 完成请求的赛跑     7.2.5 增加资源占用     7.2.6 问题解决了吗    7.3 实例:Ajax增强的相册    7.4 小结   第8 案例研究:实现带进度条的异步文件上传功能    8.1 信息载入时的小生命    8.2 起点    8.3 完成整合:上传进度指示器     8.3.1 addProgressBar()对象的结构     8.3.2 载入事件     8.3.3 addProgressBar()对象    8.4 小结  第三部分 部分高级脚本编程资源  第9 通过库来提高生产力    9.1 选择合适的库    9.2 增强DOM操作能力     9.2.1 连缀语法     9.2.2 通过回调函数进行过滤     9.2.3 操纵DOM文档    9.3 处理事件     9.3.1 注册事件     9.3.2 自定义事件    9.4 访问和操纵样式    9.5 通信    9.6 小结   第10 添加效果增强用户体验    10.1 自己动手实现效果     10.1.1 让我看到内容     10.1.2 提供反馈    10.2 几个视觉效果库简介    10.3 视觉盛宴     10.3.1 MOO式的CSS属性修改     10.3.2 通过Script.aculo.us实现视觉效果     10.3.3 通过Moo.fx实现逼真的运动效果     10.3.4 圆角效果     10.3.5 其他库    10.4 行为增强    10.5 小结   第11 丰富的Mashup!运用API添加地图、搜索及更多功能    11.1 API密钥    11.2 客户端API:离不开JavaScript     11.2.1 地图中的Mashup应用     11.2.2 Ajax搜索请求     11.2.3 地图与搜索的Mashup应用    11.3 服务器端API:需要代理脚本     11.3.1 通过Basecamp构建集成的To-Do列表     11.3.2 通过Flickr取得个性头像    11.4 小结   第12 案例研究:用DOM设计选择列表    12.1 经典的感觉    12.2 构建更好的选择列表    12.3 策略?我们不需要臭哄哄的策略     12.3.1 相关的文件     12.3.2 FauxSelect对象     12.3.3 开始创建人造select元素     12.3.4 查找select元素     12.3.5 构建DOM元素    12.4 添加事件——为人造select赋予生命    12.5 让表单绽放光彩    12.6 行为修正     12.6.1 z-index来救急     12.6.2 键盘控制及其他细节     12.6.3 select太大了吗    12.7 最后的细节    12.8 继续替换select的冒险    12.9 小结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值