《DOM Scripting》学习笔记-——第五章、第六章 案列改进

第四章的案例代码可以得到更好的改进。例如:预留退路、向后兼容性和分离js。

原html代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8   <h1>Snapshots</h1>
 9   <ul>
10     <li>
11       <a href="images/rose.jpg" onclick="showPic(this);return false" title="A fireworks display">Fireworks</a>
12     </li>
13     <li>
14       <a href="images/rose.jpg" onclick="showPic(this);return false" title="A cup of black coffee">
15  Coffee</a>
16     </li>
17     <li>
18       <a href="images/rose.jpg" onclick="showPic(this);return false" title="A red, red rose">Rose</a>
19     </li>
20     <li>
21       <a href="images/bigben.jpg" onclick="showPic(this);return false" title="The famous clock">
22  Big Ben</a>
23     </li>
24  </ul>
25
26   <img id="placeholder" src="images/placeholder.gif" alt="my image gallery" />
27   <p id="description">Choose an image.</p>
28
29 </body>
30 </html>

原js代码:

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

一、解决预留退路问题:
     没有使用js伪协议,即使js功能被禁用,a链接仍可以链接到图片,虽然与js在当前页面上切换显示新图片的效果略差一些,但网页的基本功能没有受到损害,页面上的所有内容都可以访问。
二、解决分离js的问题:
     1、onclick事件处理函数直接插到html文档里,不符合“分离js”原则。
    解决:
     (1)找到“挂钩”把js代码与html文档中有关标记关联起来。
            a、给每个链接添加一个class属性。(较麻烦)
            b、给ul加一个id(id=“imagegallery”)
    (2)添加事件处理函数,该函数需要具有以下功能:
            a、检查当前浏览器是否理解getElementsByTagName()方法。
            b、检查当前浏览器是否理解getElementById()方法。
            c、检查当前网页是否包含着一个id属性值是“imagegallery”的元素。
            d、构造一个循环来对“Imagegallery”元素中的链接进行遍历处理。
            e、对onclick事件处理函数进行设置,让它在有关链接被点击时完成以下操作:把这个链接作为参数传递给showpic()函数;取消链接被点击时的默认行为,不让浏览器打开这个链接。

①进行必要的检查

1 if (!document.getElementsByTagName) {
2 return false;
3 }
4 if (!document.getElementById) {
5 return false;
6 }

1 function prepareGallery() {
2 if (!document.getElementsByTagName) return false;
3 if (!document.getElementById) return false;
4 if (!document.getElementById("imagegallery")) return false;

结构化程序设计(structed programming)原则:每个函数应该只有一个入口点和一个出口点。
但是过分拘泥以上原则会使得代码难以阅读。所以一般而言,同一个函数有多个出口点的情况是可以接受的,但前提是它们应该集中出现在函数的开头部分。如第二种方法所示。
         ②创建必要的变量

1 var gallery = document.getElementById("imagegallery");
2 var links = gallery.getElementsByTagName("a");

③创建循环

for ( var i=0; i < links.length; i++) {

④完成必要的操作

1 links[i].onclick = function() {
2 showPic(this);
3 return false;
4 }

匿名函数一般用于只出现一次的函数

       ⑤完成js函数

 1 function prepareGallery() {
 2 if (!document.getElementsByTagName) return false;
 3 if (!document.getElementById) return false;
 4 if (!document.getElementById("imagegallery")) return false;
 5 var gallery = document.getElementById("imagegallery");
 6 var links = gallery.getElementsByTagName("a");
 7 for ( var i=0; i < links.length; i++) {
 8 links[i].onclick = function() {
 9 showPic(this);
10 return false;
11 }
12 }
13 }

⑥把多个js函数绑定到onload事件处理函数上。在html文档完成加载之前,DOM是不完整的,必须使这个函数只在网页加载完毕之后才得到执行。网页加载完毕时会触发一个onload事件,这个事件与window对象相关联。

1 window.onload = function() {
2 firstFunction();
3 secondFunction();
4 }

或者使用addLoadEvent()函数

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

三、js函数的优化

时间: 2024-10-12 18:17:25

《DOM Scripting》学习笔记-——第五章、第六章 案列改进的相关文章

Django学习笔记(五)—— 表单

疯狂的暑假学习之  Django学习笔记(五)-- 表单 参考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path                                 除域名以外的请求路径,斜杠开头                      "/hello/" request.get_host()                      主机名                              

《CSS网站布局实录》学习笔记(五)

第五章 CSS内容排版 5.1 文字排版 5.1.1 通栏排版 进行网页通栏排版时,只要直接将段落文字放置于p或者其他对象中,再对段落文字应用间距.行距.字号等样式控制,便形成了排版雏形. 5.1.2 分栏排版 CSS2技术对普通段落文字不能够直接实现分栏排版,如果需要实现类似报纸那样的双栏或者三栏排版,则必须借助于二列布局那样的两个div浮动定位而形成二列控件,然后再将文字分别填充此二列之中.XHTML代码如下: 1 <div id="layout"> 2 <div

【DOM】学习笔记

三. 一份文档就是一颗节点树 节点类型:元素节点--属性节点.文本节点 getElementById()返回一个对象,对应一个元素节点 getElementByTagName()返回一个对象数组,分别对应一个元素节点 getAttribute() setAttribute() 四. childNodes nodeType nodeValue firstChild lastChild 五. DOM脚本编程习惯 预留后路 分离JS 向后兼容性 [DOM]学习笔记,布布扣,bubuko.com

《lua程序设计(第二版)》学习笔记(五)

-- 第 5 章 函数 -- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun,感慨广州没有晴天 -- 函数没有参数也要括号 -- 特殊情况:只有一个参数的时候, 并且参数一个string/table构造式,可不写括号 print "Hello world" -- dofile "chapter03.lua" -- 冒号操作符:为面向对象式的调用而提供的函数

疯狂Android讲义 - 学习笔记(五)

第五章 Android使用统一的Intent对象来封装“启动意图”,不管是启动Activity.Service组件.或者BroadcastReceiver等,提供了一致的编程模型.Intent设计有点类似于Struts2框架中的逻辑视图设计. Intent还是应用程序组件之间通信的重要媒介:数据封装成Bundle对象,Intent携带Bundle对象. 5.1 Intent对象详解 5.2 Intent的属性及intent-filter配置 5.2.1 Component属性 5.2.2 Act

汇编入门学习笔记 (五)—— 包含多个段的程序

疯狂的暑假学习之  汇编入门学习笔记 (五)-- 包含多个段的程序 参考: <汇编语言> 王爽 第6章 1.在代码中使用数据. assume cs:code code segment dw 0123h,0456h,0789h,0defh mov ax,0 mov bx,0 mov ax,4c00H int 21h code ends end dw 表示定义字型数据,db 表示定义字节型数据. 上面代码编译连接,用debug调试,-u cs:0 查看汇编代码,发现没有看到 mov ax,0  m

Lucene学习笔记: 五,Lucene搜索过程解析

一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: IndexReader打开索引文件,读取并打开指向索引文件的流. 用户输入查询语句 将查询语句转换为查询对象Query对象树 构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分). 构造Scorer对象树,用于计算打分(T

《iOS应用逆向工程》学习笔记(五)初尝越狱插件OpenSSH

首先在越狱机子上装上OpenSSH插件,然后查看设备的IP地址,这里假设为192.168.xxx.xxx. 然后用Mac上的Terminal通过Open SSH连接到设备上(初次登录密码是alpine,必须立即修改,否则任何人都可以连接到你的机子上搞破坏). 连接命令为:ssh [email protected]设备IP地址 修改密码命令为:passwd 例如: $ ssh [email protected] The authenticity of host '192.168.xxx.xxx (

mysql学习笔记 第五天

使用分区数据表: 分区数据表和merge数据表具有相似的作用,但是分区数据表确确实实是一个数据表 ,不像merge是列出数据表的逻辑关系,并且分区数据表可以包括像myisam以外的 的数据表.创建分区数据表: create table 里给出数据列和索引,然后用partition by 定义一个用来把数据行分配 到各个分区的分区函数:[将数据表分成四个区] create table log_partition( dt datetime not null, info varchar(100) no

Cocos2d-x 3.2 学习笔记(五)Sprite Node

游戏中最重要的元素Sprite精灵,关于精灵的创建,精灵的控制等等. 涉及到的类Class: AnimationFrame 动画帧. Animation 动画对象:一个用来在精灵对象上表现动画的动画对象. AnimationCache 动画缓存单例类. 如何你想要保存动画,你需要使用这个缓存. Sprite 精灵;定义为二维图像. SpriteBatchNode 与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成. SpriteFrame 一个精灵帧. SpriteFrameCac