zoukankan      html  css  js  c++  java
  • javascript dom代码应用:简单的相册

      最近一直对前端开发很感兴趣,特别是在像jquery这种流行ajax类库的帮助下,即使没有很好的javascript功底也能做出不错的动态效果,确实是方便。但我觉得这还不行,毕竟什么都是人家封装好的,得自己深入学习下原生的javascript才踏实。今天看到一篇不错的博文,介绍了一个基于js dom编程的相册实例,虽然这个例子很小,但个人认为还是很有学习价值的,先给出html和效果图,这样有助于后面js的理解。

        

     1 <div id="content">
     2     <h1>Snapshots</h1>
     3     <ul id="imagegallery">
     4         <li>
     5             <a href="photo/fireworks.jpg" title="A fireworks display">
     6                 <img src="photo/thumbnail_fireworks.jpg" alt="Fireworks" />
     7             </a>
     8         </li>
     9         <li>
    10             <a href="photo/coffee.jpg" title="A cup of black coffee">
    11                 <img src="photo/thumbnail_coffee.jpg" alt="Coffee" />
    12             </a>
    13         </li>
    14         <li>
    15             <a href="photo/rose.jpg" title="A red, red rose">
    16                 <img src="photo/thumbnail_rose.jpg" alt="Rose" />
    17             </a>
    18         </li>
    19         <li>
    20             <a href="photo/bigben.jpg" title="The famous clock">
    21                 <img src="photo/thumbnail_bigben.jpg" alt="Big Ben" />
    22             </a>
    23         </li>
    24     </ul>
    25 </div>

    结构还是挺简单的,这里a元素的href属性值为要显示大图的路径,img为对应的小图。效果就是点击下面的小图,上面显示对应的大图。

    下面给出js实现:

     1     /*step1:代码开始*/
     2     function preparePlaceholder() {
     3         if(!document.createElement) return false;
     4         if(!document.createTextNode) return false;
     5         
     6         /*创造一个img元素,设置它的属性*/
     7         var placeholder = document.createElement("img");
     8         placeholder.setAttribute("id", "placeholder");
     9         placeholder.setAttribute("src", "photo/placeholder.gif");
    10         placeholder.setAttribute("alt", "my image gallery");
    11         
    12         /*创建一个段落,作为描述*/
    13         var description = document.createElement("p");
    14         description.setAttribute("id","description");
    15         var desctext = document.createTextNode("choose an image");
    16         description.appendChild(desctext);
    17         
    18         /*imagegallery是文档里的ul*/
    19         var gallery = document.getElementById("imagegallery");
    20         
    21         /*将大图和描述文字插入文档*/
    22         gallery.parentNode.insertBefore(placeholder, gallery);
    23         gallery.parentNode.insertBefore(description, gallery);
    24     }
    25 
    26     /*step2:给所有的imagegallery的a添加上click事件响应函数*/
    27     function prepareGallery() {
    28         if(!document.getElementsByTagName) return false;
    29         if(!document.getElementById) return false;
    30         if(!document.getElementById("imagegallery")) return false;
    31         var gallery = document.getElementById("imagegallery");
    32         var links = gallery.getElementsByTagName("a");
    33         for(var i=0; i < links.length; i++) {
    34             links[i].onclick = function() {
    35                 return showPic(this);
    36             }
    37             links[i].onkeypress = links[i].onclick;
    38         }    
    39     }
    40 
    41     /*step3:相册代码的关键函数,传入参数为a元素*/
    42     function showPic(whichpic) {
    43         if(!document.getElementById("placeholder")) return true;
    44         
    45         /*取得a元素的href*/
    46         var source = whichpic.getAttribute("href");
    47         var placeholder = document.getElementById("placeholder");
    48         
    49         /*显示图片:让img元素的src变为a元素的href*/
    50         placeholder.setAttribute("src",source);
    51         if(!document.getElementById("description")) return false;
    52         
    53         /*取得a元素的title*/
    54         if(whichpic.getAttribute("title")) {
    55             var text = whichpic.getAttribute("title");
    56         } else {
    57             var text = "";
    58         }
    59         
    60         /*将a元素的title赋给描述文字*/
    61         var description = document.getElementById("description");
    62         if(description.firstChild.nodeType == 3) {
    63             description.firstChild.nodeValue = text;
    64         }
    65         
    66         return false;
    67     }
    68 
    69     /*添加load事件响应函数的函数*/
    70     function addLoadEvent(func) {
    71         var oldonload = window.onload;
    72         if(typeof window.onload != 'function') {
    73             window.onload = func;
    74         } else {
    75             window.onload = function() {
    76                 oldonload();
    77                 func();
    78             }
    79         }
    80     }
    81 
    82     /*为事件初始化*/
    83     addLoadEvent(preparePlaceholder);
    84     addLoadEvent(prepareGallery);

         我们先看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,很有意思...有递归的感觉,把事件函数像队列一样加了进去,然后顺次执行。

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

        实例代码下载

  • 相关阅读:
    Extjs4.0以上版本 Ext.Ajax.request请求的返回问题
    C# NPOI 操作Excel 案例
    C# Microsoft.Office 操作Excel总结
    asp.net core NLog将日志写到文件
    新装的SSMS一打开就显示VS许可证过期,但VS又运行正常,解决方法。
    sql server 查询log日志 sql语句
    sql server 删除所有表及所有存储过程、所有视图和递归查询、数字类型转为字符串
    C#使用Selenium+PhantomJS抓取数据
    python爬虫实例项目大全
    SQL Server TVPs 批量插入数据
  • 原文地址:https://www.cnblogs.com/AndyWithPassion/p/simple_gallery.html
Copyright © 2011-2022 走看看