《Javascript DOM编程艺术》阅读笔记一

本篇笔记是对于《Javascript DOM编程艺术第2版》的笔记!第二版哦~
第二版在第一版的基础上经过了扩展,涵盖了HTML5、Ajax和JavaScript库(尤其是jQuery);且这一版以介绍库的附录代替了上一版介绍DOM方法的附录。(由Jerrymy Keith写的序得知)
编写代码时,切记“渐进增强,平稳退化”

第二章_JavaScript语法笔记
注释

“//” 用来注释单行
“/* xxx*/” 用来注释多行
"<!–“HTML风格注释,但这种做法仅适用于单行注释;如果是在HTML文档中,还需要以”–>“来结束注释,但JavaScript不要求这样做,它会把”–>"视为注释内容的一部分。

变量
  • JavaScript允许程序员直接对变量赋值而无需事先声明,但提前声明变量是一种良好的编程习惯。
  • JavaScript语言中,变量和其他语法元素的名字都是区分字母大小写的。
  • JavaScript语言不允许变量名中包含空格或标点符号(美元符号"$“和下划线”_"例外)
  • JavaScript变量名允许包含字母(A-Z,a-z)、数字(0-9)、美元符号($)和下划线(_),但第一个字符不允许是数字
  • 下划线命名法(变量命名),驼峰命名法(函数名、方法名和对象属性名命名)。
  • 注意作用域!!!
数据类型
  • JavaScript不需要进行类型声明,因此它是一种弱类型语言。
  • 字符串,必须包在引号里;若遇字符串中包含引号需使用反斜线对字符“\”进行转义。标量
  • 数值,浮点数。标量
  • 布尔值。标量
  • 数组,下标从0开始计数。变量
    1. 传统数组。
    2. 关联数组,不推荐使用。key值(下标)为字符串,本质上创建的是Array对象的属性。
  • 对象,对象的每个值都是对象的一个属性。自包含的数据集合
    * 属性是隶属某个特定对象的变量;
    * 方法是只有某个特定对象才能调用的函数。
  1. 内建对象,内建在JavaScript语言里的对象。例如Array,Math,Data…
  2. 宿主对象,由运行环境提供。例如Form,Image,Element,document,window…
  3. 用户定义对象,由程序员自行创建的对象。
  • 在JavaScript中,所有的变量实际上都是某种类型的对象。
操作

!!这里主要是遇到不同情况,特别备注一下。
2.4.1比较操作符举例“下面是一个错误地进行“等于”比较的例子”使用了单个等号(=)来判断结果永远为true,说明的理由是“因为这个赋值操作总会成功,所以这个条件语句的结果将永远是true”,审校者注若赋值false的话判断结果为false。(此处小伙伴也做了测试,发现如果将赋值的变量(your_mood)赋值为flase|undefine|null,对应的my_mood=your_mood的值亦为flase|undefine|null。如果赋值为字符串,输出也为字符串。所以觉得判断与赋值成功与否无关,而是判断被赋值的变量最后的值,有非false或空的值便为true)

第三章_DOM笔记(DOM,D-document,O-object,M-model/map)
document.getElementById("id");// 通过元素ID获取元素对象
document.getElementsByTagName("tag");// 通过标签名获取元素对象数组
document.getElementsByTagName("*");// "*"通配符,获取文档中所有元素
documetn.getElementsByClassName("className");// 返回具有相同类目的元素数组
object.getAttribute("attribute");// 获取元素节点对象属性值
object.setAttribute("attribute","value");// 设置元素节点对象属性值
节点
节点
元素节点
<**></**>
文本节点
<**>***</**>
属性节点
<** ***=****></**>

PS:注意,文件节点为中间***,总是包含在元素节点的内部;属性节点为中间***=****,总是被放在起始标签里。<**></**>为元素节点。

CSS
CSS
**.***
class属性
.***
#****
id属性
标签名
取代默认标签样式

PS:节点树上的各个元素将继承其父元素的样式属性。
typeof操作符,返回操作数类型。
类属性节点可赋值多个类型,且不具先后顺序关系。
文档中的每个元素节点都是一个对象。

第四章_案列研究:JavaScript图片库笔记
elements = element.childNodes;// 获取element元素全部子元素的数组elements(子元素并非只有元素节点)
nodeType = node.nodeType;// nodeType总共有12种可取值,元素节点1,属性节点2,文本节点3...
node.nodeValue;// 文本节点的值,注意找对文本节点!!否则极可能返回一个null值
element = node.firstChild();// 等价于node.childNodes[0]
element = ndoe.lastChild();// 等价于node.childNode[childNode.lenght - 1],不过后者写法复杂!no!!

window.onload = function funName(){};// 页面加载时执行,onload事件处理函数

DOM是一种适用于多种环境和多种程序设计语言的通用型API。
合并js->减少请求->提高性能

第五章_最佳实践笔记
window.open(url,name,features);// 创建新的浏览器窗口

当浏览器不支持js,用户禁用js,searchbot搜索机器人爬虫时,注意平稳退化。确保网页在没有JavaScript的情况下也能正常工作。

性能考虑
尽量少访问DOM和尽量减少标记
合并和放置脚本
减少请求数量
<script>放在文档末端</body>前
压缩脚本
Douglas Crockford的JSMin
雅虎的YUI Compressor
谷歌的Closure Compiler

[多次使用同一个结果可保存在一个变量中,避免浪费搜索]
[减少整体文件大小,加快加载速度]
代码压缩工具:

  1. Douglas Crockford的JSMin
  2. 雅虎的YUI Compressor
  3. 谷歌的Closure Compiler
  • 平稳退化
  • 分离JavaScript
  • 渐进增强
  • 向后兼容(对象检测)
第六章_案例研究:图片库改进版笔记
if(!document.getElementsByTagName)return false;// 检查工作,只举一个例子,其他方法同
variable = condition ? if true : if false;// 三元操作符

结构化程序设计(structed programming)中,有条原则:函数应该只有一个入口和出口。作者个人认为,如果函数有多个出口,只要这些出口集中出现在函数的开头部分,就是可以接受的。
onload加载事件事件处理函数追加:

function addLoadEvent(func){
	let oldonload = window.onload;
	if(typeof window.onload != 'function'){
		window.onload = func;
	} else {
		window.onload = function(){
			oldonload();
			func();
}}}

最好不要使用onkeypress事件(处理键盘事件)处理函数,onclick事件处理函数已经能够满足需要。
nodeName得到的值为标签的大写版本。

DOM CoreHTML-DOM
支持DOM的任何一种语言都可使用只能用来处于Web文档
document.getElementsByTagName(“form”)document.form
element.getAttribute(“src”)element.src
第七章_动态创建标记笔记
document.write();// 将字符串插入到文档; 避免使用!!!
element.innerHTML();// 读、写某个给定元素的HTML内容
document.createElement(nodeName);// 创建元素节点
parent.appendChild(child);// 将child节点插入parent节点树的末端
document.createTextNode(text);// 创建文本节点
parentElement.insertBefore(newElement,targetElement);// 在现有元素前加入一个新元素
targetElement.parentNode.insertBefore(newElement, targetElement);//同上
//上方的方法结合targetElement.nextSibling使用,可在现有元素后插入一个新元素
parent = element.parentNode;// 获取父节点
nextElement = element.nextSibling;// 下一个兄弟元素节点

/* 自制将新节点插入指定节点之后 */
function insertAfter(newElement, targetElement){
	let parent = targetElement.parentNode;
	if(parent.lastChild == targetElement){
		parent.appendChild(newElement);
	} else {
		parent.insertBefore(newElement,targetElement.nextSibling);
	}
}

元素节点的父元素必须是另一个元素节点(属性节点和文本节点的子元素不允许是元素节点)

《Javascript DOM编程艺术》阅读笔记二

=====================================================================
不在于你做什么,只在于你怎么做。
没有不好的技术,只有没有用好的技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值