XyyFighting


  • 首页

  • 标签

  • 分类

  • 归档

Javascript DOM编程艺术读书笔记8

发表于 2017-10-16 | 分类于 读书笔记 , Javascript DOM编程艺术

第8章 充实文档的内容

两项重要原则:

  1. 渐进增强:应该总是从最核心的部分,也就是从内容开始逐步加强
  2. 平稳退化:缺乏必要的CSS和JS支持的访问者也可以访问到核心内容

充实文档的基本思路
用JS函数先把文档结构里的一些现有信息提取出来,再把哪些信息以一种清晰和有意义的方式插入到文档中去。比如下面编写的几个函数:

  • displayAbbreviations.js:把文档里的缩略语显示为一个“缩略语”列表
  • displayCitations.js:把文档里引用的每段文献节选生成一个“文献来源链接”
  • displsyAccesskeys.js:把一个元素与键盘上的某个特定按键关联在一起

1
2
3
4
5
6
7
8
9
10
├─explanation.html
│
├─scripts
│ addLoadEvent.js
│ displayAbbreviations.js
│ displayCitations.js
│ displsyAccesskeys.js
│
└─styles
typography.css

explanation.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Explaining the Document Object Model</title>
<link rel="stylesheet" type="text/css" media="screen" href="styles/typography.css"/>
<script type="text/javascript" src="scripts/addLoadEvent.js"></script>
<script type="text/javascript" src="scripts/displayAbbreviations.js"></script>
<script type="text/javascript" src="scripts/displayCitations.js"></script>
<script type="text/javascript" src="scripts/displsyAccesskeys.js"></script>
</head>
<body>
<ul id="navigation">
<li><a href="index.html" accesskey="1">Home</a></li>
<li><a href="search.html" accesskey="4">Search</a></li>
<li><a href="contact.html" accesskey="0">Contact</a></li>
</ul>
<h1>What is the Document Object Model?</h1>
<p>
The <abbr title="World Wide Web Consortium">W3C</abbr> defines
the <abbr title="Document Object Model">DOM</abbr> as:
</p>
<blockquote cite="http://www.w3.org/DOM/">
<p>
A platform- and language-neutral interface that will allow programs
and scripts to dynamically access and update the
content, structure and style of documents.
</p>
</blockquote>
<p>
It is an <abbr title="Application Programming Interface">API</abbr>
that can be used to navigate <abbr title="HyperText Markup Language">
HTML</abbr> and <abbr title="eXtensible Markup Language">XML
</abbr> documents.
</p>
</body>
</html>

addLoadEvent.js

1
2
3
4
5
6
7
8
9
10
11
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
oldonload();
func();
}
}
}

displayAbbreviations.js:把文档里的缩略语显示为一个“缩略语”列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function displayAbbreviations() {
if (!document.getElementsByTagName || !document.createElement || !document.createTextNode) return false;
//取得所有缩略词
var abbrevistions = document.getElementsByTagName("abbr");
//判断是否有abbr元素
if (abbrevistions.length < 1) return false;
var defs = new Array();
//遍历这些缩略词
for (var i = 0; i < abbrevistions.length; i++) {
var current_abbr = abbrevistions[i];
//在IE浏览器中的平稳退化,如果当前元素没有子节点,就会立刻开始下一次循环。因为IE浏览器在统计abbr元素的子节点的个数时总会返回一个错误的值0.
if(current_abbr.childNodes.length<1)continue;
var definition = current_abbr.getAttribute("title");
//文本节点是元素内部的第一个也是最后一个节点,即唯一节点
var key = current_abbr.lastChild.nodeValue;
defs[key] = definition;
}
//创建定义列表
var dlist = document.createElement("dl");
//遍历定义
for (key in defs) {
var definition = defs[key];
//创建定义标题
var dtitle = document.createElement("dt");
var dtitle_text = document.createTextNode(key);
dtitle.appendChild(dtitle_text);
//创建定义描述
var ddesc = document.createElement("dd");
var ddesc_text = document.createTextNode(definition);
ddesc.appendChild(ddesc_text);
//把他们添加到定义列表
dlist.appendChild(dtitle);
dlist.appendChild(ddesc);
}
//ie浏览器的defs数组是空的,就不会创建出任何dt和dd元素,如果dl没有任何子节点,就立刻退出该函数
if(dlist.childNodes.length<1) return false;
//创建标题
var header = document.createElement("h2");
var header_text = document.createTextNode("Abbreviations");
header.appendChild(header_text);
//把标题添加到页面主体
document.body.appendChild(header);
//把定义列表添加到页面主体
document.body.appendChild(dlist);
}
addLoadEvent(displayAbbreviations);

displayCitations.js:把文档里引用的每段文献节选生成一个“文献来源链接”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function displayCitations(){
if(!document.getElementsByTagName||!document.createElement||!document.createTextNode) return false;
//取得所有的引用
var quotes=document.getElementsByTagName("blockquote");
//遍历引用
for(var i=0;i<quotes.length;i++){
//如果该节点没有cite属性,就立刻跳到下一个循环
if(!quotes[i].getAttribute("cite")){
continue;
}
//保存cite属性
var url=quotes[i].getAttribute("cite");
//取得引用中的所有元素节点的固定用法,不能直接quites[i].lastChild因为最后一个子节点可能是换行符之类,而不是最后一个元素节点
var quoteChildren=quotes[i].getElementsByTagName('*');
//如果没有元素节点,就继续循环
if(quoteChildren.length<1)continue;
//取得引用中的最后一个元素节点
var elem=quoteChildren[quoteChildren.length-1];
//创建标记
var link=document.createElement("a");
var link_text=document.createTextNode("source");
link.appendChild(link_text);
link.setAttribute("href",url);
var superscript=document.createElement("sup");
superscript.appendChild(link);
//把标记添加到引用中的最后一个元素节点
elem.appendChild(superscript);
}
}
addLoadEvent(displayCitations);

displsyAccesskeys.js:把一个元素与键盘上的某个特定按键关联在一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

function displayAccesskeys(){
if(!document.getElementsByTagName||!document.createElement||!document.createTextNode)return false;
//取得文档中的所有链接
var links=document.getElementsByTagName("a");
//创建一个数组,保存访问键
var akeys=new Array();
//遍历链接
for(var i=0;i<links.length;i++){
var current_link=links[i];
//如果没有accesskey属性,就继续下一个循环
if(!current_link.getAttribute("accesskey"))continue;
//取得accesskey的值
var key=current_link.getAttribute("accesskey");
//取得链接文本
var text=current_link.lastChild.nodeValue;
//添加到数组
akeys[key]=text;
}
//创建列表
var list=document.createElement("ul");
//遍历访问键
for(key in akeys){
var text=akeys[key];
//创建放到列表项中的字符串
var str=key+":"+text;
//创建列表项
var item=document.createElement("li");
var item_text=document.createTextNode(str);
item.appendChild(item_text);
//把列表项添加到列表中
list.appendChild(item);
}
//创建标题
var header=document.createElement("h3");
var header_text=document.createTextNode("Accesskeys");
header.appendChild(header_text);
//把标题添加到页面主体
document.body.appendChild(header);
//把列表添加到页面主体
document.body.appendChild(list);
}
addLoadEvent(displayAccesskeys);

typography.css

1
2
3
4
5
6
7
8
9
body {
font-family: "Helvetica","Arial",sans-serif;
font-size: 10pt;
}
abbr {
text-decoration: none;
border: 0;
font-style: normal;
}

Javascript DOM编程艺术读书笔记7

发表于 2017-10-14 | 分类于 读书笔记 , Javascript DOM编程艺术

第7章 动态创建标记

  • document.write的最大缺点是它违背了”行为应该与表现分离”的原则
  • MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。

图片库二次改进

  • 问题:在原本的Xhtml文件中有一个图片和一段文字仅仅是为showPic脚本服务的

    1
    2
    3
    <img id="placeholder" src="images/placeholder.gif"/>
    <p id="description">Choose an image</p>
    <script src="scripts/showPic.js">
  • 解决方法:结构和行为应该彻底分开,元素的存在只是让DOM方法处理他们,那么用DOM方法创建他们才是最合适的选择。

showPic.js含有五个函数

  • addLoadEvent:通用型函数,在页面加载完毕时执行的函数
  • insertAfter:通用型函数,在现有元素后面插入一个新元素
  • preparePlaceholder:负责创建一个img和一个p元素,把新创建的函数插入到节点数里图片库清单的后面
  • prepareGallery:遍历处理图片库清单里的每个链接
  • showPic:当用户点击这些链接中的某一个时,就调用该函数。

gallery.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<title>Image Gallery</title>
<link rel="stylesheet" type="text/css" href="styles/layout.css" media="screen">
</head>

<body>
<h1>Snapshots</h1>
<ul id="imagegallery">
<li>
<a href="images/1.jpg" title="A fireworks display"><img src="images/1.jpg" alt="fireworks"></a>
</li>
<li>
<a href="images/2.jpg" title="A cup of black coffee"><img src="images/2.jpg" alt="coffee"></a>
</li>
<li>
<a href="images/3.jpg" title="A red, red rose"><img src="images/3.jpg" alt="rose"></a>
</li>
</ul>
<script src="scripts/showPic.js"></script>
</body>
</html>

showPic.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
addLoadEvent(prepareGallery);
addLoadEvent(preparePlaceholder);

function addLoadEvent(func) {
//把现有的window.onload事件梳理函数的值存入变量oldonload
var oldonload = window.onload;
//如果这个处理函数上还没有绑定任何函数,就把新函数添加给她
if (typeof window.onload != 'function') {
window.onload = func;
} else {
//如果已经绑定了一些函数,就把新函数追加到现有指令的末尾
window.onload = function () {
oldonload();
func();
}
}
}

function prepareGallery() {
//1.检查点。不理解DOM方法的浏览器不执行这个函数
if (!document.getElementsByTagName) return false;
if (!document.getElementById) return false;
//即使html页面中删除图片库,js代码也不会出错。JS代码不应该对网页的结构有任何依赖
if (!document.getElementById("imagegallery")) return false;
//imagegallery中的所有链接
var gallery = document.getElementById("imagegallery");
var links = gallery.getElementsByTagName("a");
//遍历
for (var i = 0; i < links.length; i++) {
//定义一个匿名函数
links[i].onclick = function () {
//this指的是links[i]。如果showPic(this)返回true,就返回false,浏览器不会打开那个链接。如果showPic(this)返回false,就返回true以允许默认行为发生
return showPic(this) ? false : true;

}
}
}

function showPic(whichpic) {
//检查特定的placeholder元素是否存在
if (!document.getElementById("placeholder")) return false;
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
if (placeholder.nodeName != "IMG") return false;
placeholder.setAttribute("src", source);
//如果description元素存在,将会被更新,如果不存在就会被忽略。
if (document.getElementById("description")) {
//如果title属性存在,text将被赋值为whichpic.getAttribute("title"),如果不存在就是空字符串
var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : "";
var description = document.getElementById("description");
//description元素的第一个子元素是否是一个文本节点
if (description.firstChild.nodeType == 3) {
description.firstChild.nodeValue = text;
}
}
return true;
}

function insertAfter(newElement, targetElement) {
var parent = targetElement.parentNode;
if (parent.lastChild == targetElement) {
//如果是最后一个元素,就把新元素追加到parent元素上
parent.appendChild(newElement);
} else {
//如果不是最后一个元素,就把新元素插入到目标元素的下一个兄弟元素之前
parent.insertBefore(newElement, targetElement.nextSibling);
}
}

function preparePlaceholder() {
if (!document.createElement) return false;
if (!document.createTextNode) return false;
if (!document.getElementById) return false;
if (!document.getElementById("imagegallery")) return false;
var placeholder = document.createElement("img");
placeholder.setAttribute("id", "placeholder");
placeholder.setAttribute("src", "images/placeholder.gif");
placeholder.setAttribute("alt", "my image gallery");
var description = document.createElement("p");
description.setAttribute("id", "description");
var desctext = document.createTextNode("Choose an image");
description.appendChild(desctext);
var gallery = document.getElementById("imagegallery");
insertAfter(placeholder, gallery);
insertAfter(description, placeholder);
}

layout.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
body {
font-family: "Helvetica", "Arial", serif;
color: #333;
background-color: #ccc;
margin: 1em 10%;
}

h1 {
color: #333;
background-color: transparent;
}

a {
color: #c60;
background-color: transparent;
font-weight: bold;
text-decoration: none;
}

ul {
padding: 0;
}

li {
float: left;
padding: 1em;
list-style: none;
}

img {
display: block;
clear: both;
}

#imagegallery {
list-style: none;
}

#imagegallery li{
display: inline;
}

#imagegallery li a img {
width: 10em;
height: 10em;
border: 0;
}

Javascript DOM编程艺术读书笔记6

发表于 2017-10-13 | 分类于 读书笔记 , Javascript DOM编程艺术

第6章 案例研究:图片库改进版

  • 问题:结构和行为没有分离
  • 解决方法:引入许多测试和检查使JS代码可以平稳退化,将实践处理函数从标记文档分离到了一个外部的JS文件,使JS代码不再依赖于HTML文档的内容和结构。

图片库一次改进

gallery.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<title>Image Gallery</title>
<link rel="stylesheet" type="text/css" href="styles/layout.css" media="screen">
</head>

<body>
<h1>Snapshots</h1>
<ul id="imagegallery">
<li>
<a href="images/1.jpg" title="A fireworks display"><img src="images/1.jpg" alt="fireworks"></a>
</li>
<li>
<a href="images/2.jpg" title="A cup of black coffee"><img src="images/2.jpg" alt="coffee"></a>
</li>
<li>
<a href="images/3.jpg" title="A red, red rose"><img src="images/3.jpg" alt="rose"></a>
</li>
</ul>
<img id="placeholder" src="images/placeholder.gif"/>
<p id="description">Choose an image</p>
<script src="scripts/showPic.js">
</script>
</body>

</html>

showPic.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
addLoadEvent(prepareGallery);

function addLoadEvent(func) {
//把现有的window.onload事件梳理函数的值存入变量oldonload
var oldonload = window.onload;
//如果这个处理函数上还没有绑定任何函数,就把新函数添加给她
if (typeof window.onload != 'function') {
window.onload = func;
} else {
//如果已经绑定了一些函数,就把新函数追加到现有指令的末尾
window.onload = function() {
oldonload();
func();
}
}
}

function prepareGallery() {
//1.检查点。不理解DOM方法的浏览器不执行这个函数
if (!document.getElementsByTagName) return false;
if (!document.getElementById) return false;
//即使html页面中删除图片库,js代码也不会出错。JS代码不应该对网页的结构有任何依赖
if (!document.getElementById("imagegallery")) return false;
//imagegallery中的所有链接
var gallery = document.getElementById("imagegallery");
var links = gallery.getElementsByTagName("a");
//遍历
for (var i = 0; i < links.length; i++) {
//定义一个匿名函数
links[i].onclick = function() {
//this指的是links[i]。如果showPic(this)返回true,就返回false,浏览器不会打开那个链接。如果showPic(this)返回false,就返回true以允许默认行为发生
return showPic(this) ? false : true;

}
}
}

function showPic(whichpic) {
//检查特定的placeholder元素是否存在
if (!document.getElementById("placeholder")) return false;
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
if (placeholder.nodeName != "IMG") return false;
placeholder.setAttribute("src", source);
//如果description元素存在,将会被更新,如果不存在就会被忽略。
if (document.getElementById("description")) {
//如果title属性存在,text将被赋值为whichpic.getAttribute("title"),如果不存在就是空字符串
var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : "";
var description = document.getElementById("description");
//description元素的第一个子元素是否是一个文本节点
if (description.firstChild.nodeType == 3) {
description.firstChild.nodeValue = text;
}
}
return true;
}

showPic的另一种方法,与上一种的true false相反

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
addLoadEvent(prepareGallery);
function addLoadEvent(func){ //多个函数绑定到onload事件处理函数上
var oldonload = window.onload;
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function(){
oldonload();
func();
}
}
}
function prepareGallery(){ //该方法只在页面加载完毕后才执行。
if(!document.getElementById) return false;
if(!document.getElementsByTagName) return false;
if(!document.getElementById("imagegallery")) return false; //预留后路
var gallery = document.getElementById("imagegallery"); //将html和js通过id标识进行连接,分离javascript
var links = gallery.getElementsByTagName("a");
for(var i=0;i<links.length;i++){
links[i].onclick = function(){
return showPic(this);
}
}
}
function showPic(whichpic){
if(!document.getElementById("placeholder")) return true; //如果没有该元素,返回true使a标签的默认行为发生,即href有效
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
placeholder.setAttribute("src",source);
if(!document.getElementById("description")) return false; //假设没有p元素,照片照常显示,返回false后,不会执行a标签中的href
var text = whichpic.getAttribute("title");
var description = document.getElementById("description");
description.firstChild.nodeValue = text;
return false;
}

layout.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
body {
font-family: "Helvetica", "Arial", serif;
color: #333;
background-color: #ccc;
margin: 1em 10%;
}

h1 {
color: #333;
background-color: transparent;
}

a {
color: #c60;
background-color: transparent;
font-weight: bold;
text-decoration: none;
}

ul {
padding: 0;
}

li {
float: left;
padding: 1em;
list-style: none;
}

img {
display: block;
clear: both;
}

#imagegallery {
list-style: none;
}

#imagegallery li{
display: inline;
}

#imagegallery li a img {
width: 10em;
height: 10em;
border: 0;
}

Javascript DOM编程艺术读书笔记5

发表于 2017-10-12 | 分类于 读书笔记 , Javascript DOM编程艺术

第5章 最佳实践

  • 平稳退化:如果正确地使用了JavaScript脚本,就可以让访问者在他们地浏览器不支持JS地情况下仍能顺利地浏览你地网站。
1
2
3
4
5
6
7
8
function popUp(winURL){
window.open(winURL,"popUp","width=320,height=480");
}
<a href="javascript:popUp('http://www.baidu.com/');">Example</a> //伪协议,不好
<a href="#" onclick="popUp('http://www.baidu.com/'); return false;">Example</a> //使用内嵌事件处理函数,不好
<a href="http://www.baidu.com/" onclick="popUp('http://www.baidu.com/'); return false;">Example</a>
//或者采用更加简介的写法
<a href="http://www.baidu.com/" onclick="popUp(this.href); return false;">Example</a>
  • getElementsByTagName记住这其中有S !!

CSS渐进增强

  • 渐进增强就是用一些额外的信息层去包裹袁术数据,按照渐进增强原则创建出的来的网页几乎都符合平稳退化原则

分离JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//<a href="http://www.example.com/" class="popup"> Example </a>
//要把点击链接之后的行为与html分离可以使用以下代码

//行为与结构分离的例子
function popUp(winURL) {
window.open(winURL, "popup", "width=320,height=480");
}

//JS代码必须在html文档全部加载到浏览器后开始执行。将JS代码打包在prepareLinks函数里,并把这个函数添加到window对象的onload事件上去。

window.onload = prepareLinks;

function prepareLinks() {
//让脚本有更好的向后兼容性,如果浏览器不能理解getElementByTagName就退出函数。
if (!document.getElementsByTagName) return false;
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;
}
}
}
}

总结

与DOM脚本变成工作有关的问题:

  1. 平稳退化:如果正确地使用JS脚本,就可以让访问者在他们的浏览器不支持JS的情况下仍能顺利地浏览你的网站
  2. 向后兼容:确保网页在古老的浏览器中也可以被正常浏览
  3. 分离JS:将JS和HTML分离开来
  4. 性能考虑:脚本对web应用整体性能的影响。应该尽量减少访问DOM和尽量减少标记、合并和防止脚本、压缩脚本。

Javascript DOM编程艺术读书笔记4

发表于 2017-10-11 | 分类于 读书笔记 , Javascript DOM编程艺术

第4章 案例研究:JS图片库

  • DOM是一种适用于多种环境和多种程序设计语言的通用型API。
  • node.firstChild与node.childNodes[0]完全等价
  • 如果想要得到<p id="description">haha</p>其中文本节点的值。若用description.nodeValue则值为NULL,因为<p>元素本身的nodeValue属性是一个空值,需要用description.firstChild.nodeValue.
  • 元素节点nodeType属性值是1
  • 属性节点nodeType属性值是2
  • 文本节点nodeType属性值是3

文件结构

1
2
3
4
5
6
7
8
9
10
11
12
│  gallery.html
│
├─images
│ 1.jpg
│ 2.jpg
│ 3.jpg
│
├─scripts
│ show.js
│
└─styles
layout.css

gallery.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<title>Image Gallery</title>
<link rel="stylesheet" type="text/css" href="styles/layout.css">
</head>

<body>
<h1>Snapshots</h1>
<ul>
<li>
<a href="./images/1.jpg" title="A fireworks display" onclick="showPic(this); return false;">Fireworks</a></li>
<li>
<a href="images/2.jpg" title="A cup of black coffee" onclick="showPic(this); return false;">Coffee</a>
</li>
<li>
<a href="images/3.jpg" title="A red, red rose" onclick="showPic(this); return false;">Rose</a>
</li>
</ul>
<img id="placeholder" src="images/placeholder.gif"/>
<p id="description">Choose an image</p>
<script src="scripts/show.js">
</script>
</body>

</html>

showPic.js

1
2
3
4
5
6
7
8
function showPic(whichpic) {
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
placeholder.setAttribute("src",source);
var text = whichpic.getAttribute("title");
var description = document.getElementById("description");
description.firstChild.nodeValue = text;
}

layout.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
body {
font-family: "Helvetica", "Arial", serif;
color: #333;
background-color: #ccc;
margin: 1em 10%;
}

h1 {
color: #333;
background-color: transparent;
}

a {
color: #c60;
background-color: transparent;
font-weight: bold;
text-decoration: none;
}

ul {
padding: 0;
}

li {
float: left;
padding: 1em;
list-style: none;
}

img {
display: block;
clear: both;
}

Javascript DOM编程艺术读书笔记1-3

发表于 2017-10-10 | 分类于 读书笔记 , Javascript DOM编程艺术
  • sublime 对比两个文件 [ctrl]+[alt]+[d]

第1章 JavaScript简史

  • DOM是一套对文档的内容进行抽象和概念化的方法。DOM是一种API,API就是一组已经得到有关各方共同认可的基本约定。
  • webkit是Safari和Chrome采用的一个开源web浏览器引擎。

第2章 JavaScript语法

1
2
3
var a=false;
var b="";
a==b //true
  • 在命名变量时,用下划线来分割各个单词;在命名函数时,从第二个单词开始把每个单词的第一个字母写成大写形式,即驼峰式命名。

javascript本地对象、内置对象、宿主对象和自定义对象

1. 本地对象

ECMA-262把本地对象(native object)定义为“独立于宿主环境的ECMAScript实现提供的对象”。
此处的宿主环境,简单来说就是用户的机器环境,包括操作系统和浏览器。
本地对象包括如下内容:Object、Function、String、Array、Boolean、Number、Date、 RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。由此可知,本地对象是ECMA-2定义的类(引用类型)。

2. 内置对象

ECMA-262把内置对象(built-in object)定义为“ 由ECMAScript实现提供的,独立与宿主环境的所有对象,在ECMAScript程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已经被实例化了。ECMA只定义了两个内置对象,即Global和Math(它们也是本地对象,根据定义,所有内置对象都是本地对象)。

  • Math对象的常见属性:E(算术常量e,即自然对数的底数,约为2.718)、PI(圆周率,约为3.14159)。
  • Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,不信,在浏览器console中输入Global,报错。

3. 宿主对象

所有非本地对象都是宿主对象(host Object),即由ECMAScript实现的宿主环境提供的对象。

所有的BOM和DOM对象都是宿主对象。

4. 自定义对象

顾名思义,就是开发人员自己定义的对象,javascript允许使用自定义对象,使javascript得到扩充。

5. 总结

本地对象是ECMA官方定义好的对象;内置对象也是本地对象,只包括Global对象和Math对象;宿主对象包括BOM和DOM对象。

第3章 DOM

  • DOM的五个方法
  • getElementById
  • getElementsByTagName:返回一个对象数组
  • getElementsByTagClassName(class):返回一个数组
  • getAttribute(attribute)
  • setAttribute(attribute,value)

w3cschool-Javascript

发表于 2017-10-01 | 分类于 学习记录 , w3cschool

基本语法

  • 您只能在 HTML 输出流中使用 document.write。 如果您在文档已加载后使用它(比如在函数中),会覆盖整个文档。

  • JavaScript 对大小写敏感

  • JavaScript 是脚本语言。浏览器会在读取代码时,逐行地执行脚本代码。而对于传统编程来说,会在执行前对所有代码进行编译。
  • 在JS函数内部生命的变量是局部变量,在JS函数外生命的变量是全局变量。向未声明的JS变量分配值,该变量将被自动作为全局变量声明。

for/in 循环

  • JavaScript for/in 语句循环遍历对象的属性:
1
2
3
4
5
6
var person={fname:"John",lname:"Doe",age:25};

for (x in person)
{
txt=txt + person[x];
}
  • 如果逻辑对象无初始值或者其值为 0、-0、null、””、false、undefined 或者 NaN,那么对象的值为 false。否则,其值为 true(即使当自变量为字符串 “false” 时)!

window对象

  • 所有浏览器都支持 window 对象。它表示浏览器窗口。
  • 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
  • 全局变量是 window 对象的属性。
  • 全局函数是 window 对象的方法。
  • 甚至 HTML DOM 的 document 也是 window 对象的属性之一

jQuery

  • jQuery 是一个 JavaScript 库。
  • 如果您希望在一个涉及动画的函数之后来执行语句,请使用 callback 函数。
  • 用三种不同的方法创建元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!DOCTYPE html>
    <html>
    <head>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
    <script>
    function appendText()
    {
    var txt1="<p>Text.</p>"; // 以 HTML 创建新元素
    var txt2=$("<p></p>").text("Text."); // 以 jQuery 创建新元素
    var txt3=document.createElement("p");
    txt3.innerHTML="Text."; // 通过 DOM 来创建文本
    $("body").append(txt1,txt2,txt3); // 追加新元素
    }
    </script>
    </head>
    <body>
    <p>This is a paragrapph.</p>
    <button onclick="appendText()">追加文本</button>
    </body>
    </html>
  • 在我的电脑上使用google的jquery地址是无效的,但是可以使用mircosoft的地址。

    1
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>

Ajax

  • AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
  • XMLHttpRequest对象用于子啊后台和服务器交换数据,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

Ajax同步和异步请求数据

  • async:false:表示同步加载数据

  • async:true:表示异步加载数据

  • 同步:
    是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。

  • 异步:
    则这个AJAX代码运行中的时候其他代码一样可以运行。

  • XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true

  • 如果是异步的(Async=true),请规定在响应处于onreadystatechange 事件中的就绪状态时执行的函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
    }
    xmlhttp.open("GET","test1.txt",true);
    xmlhttp.send();
  • 如果是同步(Async=false),请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可:

    1
    2
    3
    xmlhttp.open("GET","test1.txt",false);
    xmlhttp.send();
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

Json

  • JSON 指的是 JavaScript 对象表示法,JSON 是轻量级的文本数据交换格式,其独立于语言和平台。

w3cschool-CSS

发表于 2017-09-27 | 分类于 学习记录 , w3cschool

知识点

  • 如果需要根据属性值中的词列表的某个词进行选择,则需要使用波浪号(~)。如果忽略了波浪号,则说明需要完成完全值匹配。
  • 根据 CSS,子元素从父元素继承属性。但是它并不总是按此方式工作。比如:Netscape 4 就不支持继承,它不仅忽略继承,而且也忽略应用于 body 元素的规则。
  • 内边距是 padding
  • 当为链接的不同状态设置样式时,请按照以下次序规则:
    a:hover 必须位于 a:link 和 a:visited 之后
    a:active 必须位于 a:hover 之后

white-space

  • 当 white-space 属性设置为 normal 时,会合并所有的空白符,并忽略换行符。
  • 当 white-space 属性设置为 pre 时,浏览器不会合并空白符,也不会忽略换行符。
  • 当 white-space 属性设置为 nowrap 时,它会防止元素中的文本换行,除非使用了一个 br 元素。在 CSS 中使用 nowrap 非常类似于 HTML 4 中用 将一个表单元格设置为不能换行,不过 white-space 值可以应用到任何元素。
  • 当 white-space 属性设置为 pre-wrap 时,浏览器不仅会保留空白符并保留换行符,还允许自动换行。
  • 当 white-space 属性设置为 pre-line 时,浏览器会保留换行符,并允许自动换行,但是会合并空白符,这是与 pre-wrap 值的不同之处。

padding和border-spacing的不同?

  • 表格内边距 如需控制表格中内容与边框的距离,请为 td 和 th 元素设置 padding 属性
  • border-spacing 属性设置相邻单元格的边框间的距离(仅用于“边框分离”模式)。

类选择器还是 ID 选择器?

在类选择器这一章中我们曾讲解过,可以为任意多个元素指定类。前一章中类名 important 被应用到 p 和 h1 元素,而且它还可以应用到更多元素。

  • 区别 1:只能在文档中使用一次
    与类不同,在一个 HTML 文档中,ID 选择器会使用一次,而且仅一次。

  • 区别 2:不能使用 ID 词列表
    不同于类选择器,ID 选择器不能结合使用,因为 ID 属性不允许有以空格分隔的词列表。

  • 区别 3:ID 能包含更多含义
    类似于类,可以独立于元素来选择 ID。有些情况下,您知道文档中会出现某个特定 ID 值,但是并不知道它会出现在哪个元素上,所以您想声明独立的 ID 选择器。例如,您可能知道在一个给定的文档中会有一个 ID 值为 mostImportant 的元素。您不知道这个最重要的东西是一个段落、一个短语、一个列表项还是一个小节标题。您只知道每个文档都会有这么一个最重要的内容,它可能在任何元素中,而且只能出现一个。

  • 请注意,类选择器和 ID 选择器可能是区分大小写的。这取决于文档的语言。HTML 和 XHTML 将类和 ID 值定义为区分大小写,所以类和 ID 值的大小写必须与文档中的相应值匹配。

first-child

  • 例子 1 - 匹配第一个<p> 元素

    1
    2
    3
    p: first-child {
    color: red;
    }
  • 例子 2 - 匹配所有 <p> 元素中的第一个 <i> 元素

    1
    2
    3
    p > i:first-child {
    font-weight:bold;
    }
  • 例子 3 - 匹配所有作为第一个子元素的 <p>元素中的所有 <i>元素

    1
    2
    3
    p:first-child i {
    color:blue;
    }

w3cschool-Html

发表于 2017-09-23 | 分类于 学习记录 , w3cschool

html

  • 不能将 <body>``</body> 标签与 <frameset></frameset> 标签同时使用!不过,假如你添加包含一段文本的<noframes>标签,就必须将这段文字嵌套于 <body>``</body>标签内。(在下面的第一个实例中,可以查看它是如何实现的。)

  • 如果要正确地被提交,每个输入字段必须设置一个 name 属性。

  • autocomplete 属性。注意,表单的自动完成功能是打开的,但是 e-mail 字段的自动完成功能是关闭的。

html5

  • 越来越多的站点开始使用 HTML5 标签。但情况是还有很多人在使用IE6,IE7,IE8。为了让所有网站浏览者都能正常的访问网站,比较好的解决方案是html5shiv.所以只需要在页面head中添加如下代码即可:
1
2
3
<!--[if lt IE 9]>
<script type="text/javascript" src="js/html5shiv.js"></script>
<![endif]-->
  • 在 HTML5 中,关闭空元素是可选的。斜杠(/)在 XHTML 和 XML 中是必需的。
1
<meta charset="utf-8" />
  • HTML5 web存储。sessionStorage 对象等同 localStorage 对象,不同之处在于只对一个 session 存储数据。如果用户关闭具体的浏览器标签页,数据也会被删除。

省略 <head>?

  • 在 HTML5 标准中, 标签也能够被省略。默认地,浏览器会把 之前的所有元素添加到默认的 元素。通过省略 标签,您能够降低 HTML 的复杂性.

object

  • 最好的 HTML 解决方法:HTML 5 + <object> + <embed>
1
2
3
4
5
6
7
8
<video width="320" height="240" controls="controls"><br/>
<source src="movie.mp4" type="video/mp4" /><br/>
<source src="movie.ogg" type="video/ogg" /><br/>
<source src="movie.webm" type="video/webm" /><br/>
<object data="movie.mp4" width="320" height="240"><br/>
<embed src="movie.swf" width="320" height="240" /><br/>
</object><br/>
</video>
  • 功能:object标签用于定义一个嵌入的多媒体对象。

  • 语法:<object>...</object>

  • object元素用于向页面添加多媒体对象,包括Flash、音频、视频等。它规定了对象的数据和参数,以及可用来显示和操作数据的代码。

  • <object>与</object>之间的文本是替换文本,如果用户的浏览器不支持此标签会显示这些文本。

  • object元素中一般会包含<param>标签,<param>标签可用来定义播放参数。

  • <object>和<embed>标签的区别:两者都是用来播放多媒体文件的对象,object元素用于IE浏览器,embed元素用于非IE浏览器,为了保证兼容性,通常我们同时使用两个元素,浏览器会自动忽略它不支持的标签。同时使用两个元素时,应该把<embed>标签放在<object>标签的内部。

1…56
Xyy

Xyy

I want to get ahead in a step-by-step

59 日志
16 分类
8 标签
© 2018 Xyy
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4