《DOM编程艺术》中初步实现的图片库的总结(二)

前言:在《DOM编程艺术》中初步实现的图片库的总结(一)中,有很多不足之处:比如事件处理嵌套在HTML中,显得如此笨重和屌丝;没有对showPic函数进行相应的安全检查等,本篇文章对上述问题做了全面的升级。
--------------------开始---------------------

1.首先要把HTML部分进行改造

去掉嵌套在HTML中的事件处理代码,并且为了js能操作标签,需要对标签添加ID属性值

# 电影天堂    1.             灰姑娘    1.             千与千寻    1.             哆啦A梦    1.             当幸福来敲门选择一张图片

2.获取标签中的节点a,遍历并且绑定事件处理

function prepareFilm(){    if(!document.getElementsByTagName){        return false;    }    if(!document.getElementById){        return false;    }    if(!document.getElementById("filmlist")){        return false;    }    var list = document.getElementById("filmlist");    var links = list.getElementsByTagName("a");    for(var i = 0; i

3.本例非必需:共享onload事件

本例中必须执行prepareFilm函数才能对onclick事件进行绑定,但是这个函数又不能在HTML文档加载之前执行,网页加载完毕时会触发一个onload事件,但是需要执行的函数有多个逐一添加又麻烦,而且后续的函数会覆盖上一个,所以就有必要封装一个addLoadEvent函数把将要执行的函数作为参数传进去,

//共享onlond事件,封装成一个函数,@func是页面加载时需要执行的那个函数。//如果window.onload在页面加载时还没有绑定任何函数,就把需要执行的函数添加给它、//如果这个处理函数已经绑定了函数,就把新函数追加到现有指令的末尾function addLoadEvent(func){    //把现有的window.onload存入变量oldonload    var oldonload = window.onload;    if(typeof window.onload != 'function'){        window.onload = func;    }else{        window.onload = function(){            oldonload();            func();        }    }}

但是这个时候还有一些bug,就是没有对showPic函数进行必要的安全检查,而showPic函数要被prepareFilm函数调用,假如它获取不到图片呢?

4.对showPic函数进行安全检查

function showPic(whichpic){    if(!document.getElementById("placeholder")) return false;    var source = whichpic.getAttribute("href");    var placeholder = document.getElementById("placeholder");    placeholder.setAttribute("src" , source);    if(document.getElementById("description")){        var text = whichpic.getAttribute("title");        var description = document.getElementById("description");        description.firstChild.nodeValue = text;      }    return true;}

但是还是有问题,就是此时prepareFilm函数做了一个假设:showPic函数肯定会正常返回,基于这一假设,prepareFilm函数在执行showPic函数时就会提前返回一个true,从而取消了onclick事件的默认行为。所以是否要返回一个false值取消onclick默认行为,应该由showPic函数决定,图片切换成功返回true,图片切换失败,返回false。
所以此时应该把prepareFilm函数最后两句改为:return !showPic(this);

5.添加更多的检查

(1)假设每个链接都有title属性,假如不存在把text值设置为空;

(2)placeholder是否存在?假设那是一张图片(本例中它确实是图片),为了验证这个情况,可以用nodeName属性增加这一项测试。

下面是添加更多的检查之后的showPic函数代码:

function showPic(whichpic){    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);    if(document.getElementById("description")){        var text = whichpic.getAttribute("title")?whichpic.getAttribute("title"):"";        var description = document.getElementById("description");        if(description.firstChild.nodeType == 3){            description.firstChild.nodeValue = text;         }     }    return true;}

6.调用addLoadEvent函数

//在页面加载完成后调用prepareFilm函数addLoadEvent(prepareFilm);

7.完整代码

老规矩,上完整源码

example    h1 {        color: # 333;    }    a {        color: gray;        font-weight: bold;        text-decoration: none;    }    ul {        padding: 0;    }    li {        float: left;        padding: 1em;        list-style-type: none;    }    img {        display: block;        clear: both;    }# 电影天堂    1.             灰姑娘    1.             千与千寻    1.             哆啦A梦    1.             当幸福来敲门选择一张图片    function showPic(whichpic){        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);        if(document.getElementById("description")){            var text = whichpic.getAttribute("title")?whichpic.getAttribute("title"):"";            var description = document.getElementById("description");            if(description.firstChild.nodeType == 3){                description.firstChild.nodeValue = text;             }         }        return true;    }    function prepareFilm(){        if(!document.getElementsByTagName){            return false;        }        if(!document.getElementById){            return false;        }        if(!document.getElementById("filmlist")){            return false;        }        var list = document.getElementById("filmlist");        var links = list.getElementsByTagName("a");        for(var i = 0; i

关键字:JavaScript

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部