博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【第六章】图片库操作改进
阅读量:6192 次
发布时间:2019-06-21

本文共 4150 字,大约阅读时间需要 13 分钟。

hot3.png

1.先来看第四章所提到的图片库代码:

Choose an image.

(1)第一个问题是,它能平稳退化吗?如果JavaScript功能禁用,它还正常工作吗?答案是肯定的。但是如果换成以下方式,在不支持或禁用JavaScript后,则会出现问题。

first picture
first picture

(2)第二个问题是,它的JavaScript与HTML标记是分离的吗?

由于onclick事件插入到了HMTL中,所以答案是它们混杂在一起了。因此,想要把JavaScript代码分离出来,首先需要想办法让HTML和JavaScript通过特定的方式关联起来(如id、class等)。

a.修改一下原有的HTML如下:

b.编写JavaScript函数,如下:

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{            showPic(this);            return false;            //如果showPic返回为true,这里onclick返回false;如果showPic返回为false,onclick返回true,执行默认点击事件            //return !showPic(this);        }     }}

c.通过window.onload执行上面的函数,如下:

window.onload = function{    prepareGallery();    //这里可要添加多个函数}

需要加载多个函数的问题,还有一种最佳的解决方法,我们新建一个函数:

function addLoadEvent(func){    var oldonload = window.onload;    if(typeof window.onload != 'function'){        window.onload = func;    }    else{        window.onload = function(){            oldonload();            func();        };    }}
addLoadEvent(prepareGallery);

d.改进showPic(),如下:

function showPic(whichPic){    if(!document.getElementById("placeholder")){         return false;    }    var source = whichPic.getAttribute("href");    var placeholder = document.getElementById("placeholder");    if(placeholder.nodeName != "IMG"){    //注意:nodeName总是返回大写字母的值        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;}

综上,整个页面代码如下:

1.新建test.html,代码如下:

Choose an image.

2.同一目录下新建test.js,代码如下:

function showPic(whichPic){    if(!document.getElementById("placeholder")){         return false;    }    var source = whichPic.getAttribute("href");    var placeholder = document.getElementById("placeholder");    if(placeholder.nodeName != "IMG"){    //注意:nodeName总是返回大写字母的值        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 addLoadEvent(func){    var oldonload = window.onload;    if(typeof window.onload != 'function'){        window.onload = func;    }    else{        window.onload = function(){            oldonload();            func();        };    }}addLoadEvent(prepareGallery);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(){            //如果showPic返回为true,这里onclick返回false;如果showPic返回为false,onclick返回true,执行默认点击事件            return !showPic(this);        }        links[i].onkeypress = links[i].onclick;  //把鼠标操作的行为传给键盘     }}

3.同一目录下,新建source文件夹,里面存放两张图片1.jpg和2.jpg。

PS:尊重原创,参考资料:JavaScript DOM编程艺术(中文第2版)

转载于:https://my.oschina.net/u/3640519/blog/1555732

你可能感兴趣的文章
指针面试题
查看>>
java Date时间的各种转换方式和Mysql存时间类型字段的分析
查看>>
UINavigationController navigationBar 隐藏方法
查看>>
Android开发BUG及解决方法
查看>>
collectionview 的相关设置
查看>>
centos 7 上配置mysql 开机启动详解
查看>>
【node.js】回调函数
查看>>
Phalcon 訪问控制列表 ACL(Access Control Lists ACL)
查看>>
做单一定要看数据,提防数据,特别是周三周四
查看>>
Android Categroy 详解大全
查看>>
java中的定时器
查看>>
【翻译】EXTJS 编码风格指南与实例
查看>>
如何判断touch到子视图或离开视图
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
5、线程终止方式:(转)
查看>>
proxool数据连接池
查看>>
网页布局流式布局
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
jQuery代码优化:基本事件
查看>>
Asp.Net MVC 分页、检索、排序整体实现
查看>>