javascript dom代码应用 简单的相册[firefox only]


Posted in Javascript onJune 12, 2010

但我觉得这还不行,毕竟什么都是人家封装好的,得自己深入学习下原生的javascript才踏实。今天看到一篇不错的博文,介绍了一个基于js dom编程的相册实例,虽然这个例子很小,但个人认为还是很有学习价值的,先给出html和效果图,这样有助于后面js的理解。 
javascript dom代码应用 简单的相册[firefox only]    

<body> 
<div id="content"> 
<h1>Snapshots</h1> 
<ul id="imagegallery"> 
<li> 
<a href="photo/fireworks.jpg" title="A fireworks display"> 
<img src="photo/thumbnail_fireworks.jpg" alt="Fireworks" /> 
</a> 
</li> 
<li> 
<a href="photo/coffee.jpg" title="A cup of black coffee"> 
<img src="photo/thumbnail_coffee.jpg" alt="Coffee" /> 
</a> 
</li> 
<li> 
<a href="photo/rose.jpg" title="A red, red rose"> 
<img src="photo/thumbnail_rose.jpg" alt="Rose" /> 
</a> 
</li> 
<li> 
<a href="photo/bigben.jpg" title="The famous clock"> 
<img src="photo/thumbnail_bigben.jpg" alt="Big Ben" /> 
</a> 
</li> 
</ul> 
</div> 
</body>

结构还是挺简单的,这里a元素的href属性值为要显示大图的路径,img为对应的小图。效果就是点击下面的小图,上面显示对应的大图。
下面给出js实现:
<script type="text/javascript"> 
/*3相册代码的关键函数,传入参数为a元素*/ 
function showPic(whichpic) { 
if(!document.getElementById("placeholder")) return true; 
/*取得a元素的href*/ 
var source = whichpic.getAttribute("href"); 
var placeholder = document.getElementById("placeholder"); 
/*显示图片:让img元素的src变为a元素的href*/ 
placeholder.setAttribute("src",source); 
if(!document.getElementById("description")) return false; 
/*取得a元素的title*/ 
if(whichpic.getAttribute("title")) { 
var text = whichpic.getAttribute("title"); 
} else { 
var text = ""; 
} 
/*将a元素的title赋给描述文字*/ 
var description = document.getElementById("description"); 
if(description.firstChild.nodeType == 3) { 
description.firstChild.nodeValue = text; 
} 
return false; 
} 
/*2给所有的imagegallery的a添加上click事件响应函数*/ 
function prepareGallery() { 
if(!document.getElementsByTagName) return false; 
if(!document.getElementById) return false; 
if(!document.getElementById("imagegallery")) return false; 
var gallery = document.getElementById("imagegallery"); 
var links = gallery.getElementsByTagName("a"); 
for(var i=0; i < links.length; i++) { 
links[i].onclick = function() { 
return showPic(this); 
} 
links[i].onkeypress = links[i].onclick; 
} 
} 
/*添加load事件响应函数的函数*/ 
function addLoadEvent(func) { 
var oldonload = window.onload; 
if(typeof window.onload != 'function') { 
window.onload = func; 
} else { 
window.onload = function() { 
oldonload(); 
func(); 
} 
} 
} 
/* 1.代码开始*/ 
function preparePlaceholder() { 
if(!document.createElement) return false; 
if(!document.createTextNode) return false; 
/*创造一个img元素,设置它的属性*/ 
var placeholder = document.createElement("img"); 
placeholder.setAttribute("id", "placeholder"); 
placeholder.setAttribute("src", "photo/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); 
/*imagegallery是文档里的ul*/ 
var gallery = document.getElementById("imagegallery"); 
/*将大图和描述文字插入文档*/ 
gallery.parentNode.insertBefore(placeholder, gallery); 
gallery.parentNode.insertBefore(description, gallery); 
} 
/*为事件初始化*/ 
addLoadEvent(preparePlaceholder); 
addLoadEvent(prepareGallery); 
</script>

我们先看preparePlaceholder函数,在这个函数里创建了一个img元素placeholder,并设置了它对应的属性(id, src, alt),又创建了一个p元素description,p元素中用appendChild方法插入了一个文本节点用于给出照片的描述,初始为“choose an image”, 然后通过document.getElementById找到ul,并把生成的img和p插到图片列表之前。说明下insertBefore的用法,查了下Mozilla developer center:

var insertedElement = parentElement.insertBefore(newElement, referenceElement);

insertedElement 其实就是newElement,作为一个返回结果

parentElement 是要插入的父级元素即插入哪个元素中

newElement 当然就是那个要插入的新元素啦

referenceElement 指要在哪个元素之前插入

    我们接着看prepareGallery函数,它的作用是为每个a元素赋予一个单击事件,其中return showPic(this)默认返回的是false,是为了阻止点击a元素后的默认行为(直接到新页面显示图片)

    下面是最核心的showPic函数,通过取得包裹对应小图片的a元素中的href 和 title属性值(href的值为小图片对应的大图片的路径),来为preparePlaceholder函数中生成的img设置src属性,和p中的描述文本,形成最终的效果。这里面有个nodeType,具体也可在Mozilla developer center中查到。

    最后还有一个很有意思的函数就是addLoadEvent,很有意思...有递归的感觉,把事件函数像队列一样加了进去,然后顺次执行。

    呵呵,这个相册就分析到这,这是我第一次发表博文,有什么不对或需要提高的地方,希望博友们多多指点,我会虚心接受的,谢谢。
代码打包下载

Javascript 相关文章推荐
js几个验证函数代码
Mar 25 Javascript
jQuery实现类似滑动门切换效果的层切换
Sep 23 Javascript
做好七件事帮你提升jQuery的性能
Feb 06 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
Jan 06 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
JS实现给对象动态添加属性的方法
Jan 05 Javascript
老生常谈的跨域处理
Jan 11 Javascript
canvas时钟效果
Feb 16 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
AngularJS中scope的绑定策略实例分析
Oct 30 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
DOM Scripting中的图片切换[兼容Firefox]
Jun 12 #Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 #Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
Jun 12 #Javascript
jquery form表单提交插件asp.net后台中文解码
Jun 12 #Javascript
JavaScript中yield实用简洁实现方式
Jun 12 #Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 #Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 #Javascript
You might like
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP生成条形图的方法
2014/12/10 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
PyQt5每天必学之组合框
2018/04/20 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Python魔术方法专题
2020/06/19 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
学校志愿者活动总结
2014/06/27 职场文书
旅游项目合作意向书
2015/05/08 职场文书
民事上诉状范文
2015/05/22 职场文书
草房子读书笔记
2015/06/29 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python