JavaScript图片库

将图片放到网上的方法有很多,你可以简单地把所有的图片都放到网页上。但是,如果你打算发布的图片过多,这个页面很快会变的过于庞大,而且加上这些图片后用户要下载的的数据量就会变得相当可观。我们必须面对这样一个现实:没有人会等待很长长时间去下载一个网页;所以利用JavaScript来创建一个图片库将是最佳的选择;

说下步骤:

第一步:把整个图片库的链接都加载到图片库的主页里;

第二步:当用户点击对应的超链接时,拦截网页的默认行为,即(超链接点击跳转行为);

第三步:当用户点击对应的超链接后,把"占位符"图片替换成那个超链接所对应的图片;

1、代码如下:

第一版:

<body>
<a href="img/index.jpg">图片一</a><br /><a href="img/index.jpg" οnclick="showPic(this);return false;">图片一</a><br /><a href="img/index1.jpg" οnclick="showPic(this);return false;">图片二</a><br /><a href="img/index2.jpg" οnclick="showPic(this);return false;">图片三</a><br /><a href="img/index4.jpg" οnclick="showPic(this);return false;">图片四</a><p>----------------------------</p><img src="img/blank.png" alt="blank"/><script type="text/javascript">function showPic(whichpic) {var source = whichpic.getAttribute('href'); //获取目标元素的src属性;var placeholder = document.getElementsByTagName('img'); //获取占位符图片对象;placeholder.setAttribute('src', source); //图片替换
        }</script>
</body>
代码解析:οnclick="showPic(this);return false;" 这段代码表示给<a></a>标签添加了一个onclick事件处理函数,添加处理函数的语法如下所示:
event="JavaScript statement" JavaScript statement->方法体,this代表当前<a></a>标签对象。
注意return false;表示阻止超链接跳转的默认行为;
让我们了解一下DOM1中的事件处理函数的工作机制。在给某个元素添加了事件处理函数后,一旦事件发生,相应的JavaScript代码就会被执行。被调用的JavaScript就会返回一个值,这个值将被传递给那个事件处理函数。
若返回的值是true,onclick事件处理函数就认为这个函数被点击了,若为false,就相反;所以加上return false,就可以防止用户被带到目标链接窗口;
注意:return
false;只在DOM1中适用;所以这段代码只会在支持DOM1标准的浏览器中才会有效,其他的浏览器任然会被带到目标窗口!关于这个bug暂时先放一放!

2、由于return false;在一些浏览器上可能看不出效果,所以我这边换了一种方式实现JS图片库;代码如下:
第二版
<body><a href="javascript:void(0);" title="img/index.jpg">图片一</a><br /><a href="javascript:void(0);" title="img/index1.jpg">图片二</a><br /><a href="javascript:void(0);" title="img/index2.jpg">图片三</a><br /><a href="javascript:void(0);" title="img/index4.jpg">图片四</a><p>----------------------------</p><img src="img/blank.png" alt="blank"/><script type="text/javascript">var a = document.getElementsByTagName('a');for (var i = 0; i < a.length; i++) {a[i].onclick = function () {showPic(this);}}function showPic(whichpic) {var source = whichpic.getAttribute('title'); //获取目标元素的title属性;var placeholder = document.getElementsByTagName('img')[0]; //获取占位符图片对象;placeholder.setAttribute('src', source); //图片替换
        }</script>
</body>

3、在学完nodeValue属性http://www.cnblogs.com/GreenLeaves/p/5695165.html#nodeValue后给JS图片库增加一个新的功能:点击超链接把图片的描述显示到图片的下面代码如下:
第三版
<body><a href="javascript:void(0);" title="img/index.jpg">图片一</a><br /><a href="javascript:void(0);" title="img/index1.jpg">图片二</a><br /><a href="javascript:void(0);" title="img/index2.jpg">图片三</a><br /><a href="javascript:void(0);" title="img/index4.jpg">图片四</a><p>----------------------------</p><img src="img/blank.png" alt="blank"/><br /><p id="description"></p><script type="text/javascript">var a = document.getElementsByTagName('a');for (var i = 0; i < a.length; i++) {a[i].onclick = function () {showPic(this);}}function showPic(whichpic) {var source = whichpic.getAttribute('title'); //获取目标元素的title属性;var placeholder = document.getElementsByTagName('img')[0]; //获取占位符图片对象;placeholder.setAttribute('src', source); //图片替换var description = document.getElementById('description');description.childNodes[0].nodeValue = source;}</script>
</body>
 

注意:当html代码中<p id="description"></p>中没有空格的时候 这句代码会报错,description.childNodes[0].nodeValue = source;原因是此时的<p>标签之间并没有子节点,若在<p></p>标签之间加一个空格,这个空格就会被解析成<p>标签的子节点,即文本节点,这样description.childNodes[0].nodeValue = source;不会报错,功能完美实现;

4、在学习完JavaScript之最佳实践后http://www.cnblogs.com/GreenLeaves/p/5701873.htm
再次对JS图片库进行升级,这次升级的主要目的是:

1、使图片库能够平稳退化(即使Broswer禁用JavaScript网页仍能正常访问)

2、使图片库能向后兼容

3、分离JS代码到单独的JS文件

4、重构之前的JS代码提高JS代码的运行性能

5、合理的放置JS脚本

6、对象检测:即使老版本浏览器不支持DOM方法,网页仍能正常运行

7、关键元素的判断,即使关键元素缺失,网页仍能正常运行

第四版:

window.onload = prepareGallery;
function prepareGallery() {if (!document.getElementById) return false;if (!document.getElementsByTagName) return false;//判断浏览器是否支持DOM方法防止浏览器不支持网页出现运行错误//判断id为imagegallery的元素是否存在,如果不存在的话网页任能正常运行if (document.getElementById("imagegallery")) {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方法没有出现问题,return false是正确的做法,但是万一shwPic出现了问题,这个时候返回false,点击超链接将没有任何反应,//所以这个地方这样该更好return !showPic(this); //如果showPic方法出现问题,超链接任然有效符合JavaSciprt平稳退化的要求;
            }}}
}
function showPic(whichpic) {if (!document.getElementsByTagName("img")[0]) return false;var source=whichpic.getAttribute("href");//获取图片的链接地址var placeholder = document.getElementsByTagName("img")[0];if (placeholder.nodeName != "IMG") return false;placeholder.setAttribute("src", source);if (!document.getElementById("description")) return false;var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : ""; //获取图片名称(判断图片超链接的文本节点(图片名称)是否存在)var description = document.getElementById("description");description.firstChild.nodeValue = text;return true;
}

 

html代码:

<body><div id="imagegallery"><a href="img/index.jpg" title="dog_one">图片一</a><br /><a href="img/index1.jpg" title="dog_two">图片二</a><br /><a href="img/index2.jpg" title="dog_three">图片三</a><br /><a href="img/index4.jpg" title="dog_four">图片四</a><p>----------------------------</p><img src="img/blank.png" alt="blank" /><br /><p id="description"></p></div><script src="picLibrary.js" type="text/javascript"></script>  <!--合理放置了JS脚本在加载完DOM后在加载JS脚本,提高了页面的加载速度,提现了内容优先的原则-->
</body>

 

 在学习完JavaScript动态向文档中添加元素和内容后http://www.cnblogs.com/GreenLeaves/p/5730898.html

再重新回到我们的图片库,我们发现在我们的htm文档中有一个图片和一段文字是专门为showPic脚本服务的,若能把结构和行为分离自然是最好的,既然这些元素的存在,是为了让DOM方法来处理它们,那么用DOM方法来创建他们才是最合适的选择。

第五版:

window.onload = prepareGallery;
function prepareGallery() {if (!document.getElementById) return false;
if (!document.createElement) return false;
if (!document.createTextNode) return false;
if (!document.getElementsByTagName) return false;//判断浏览器是否支持DOM方法防止浏览器不支持网页出现运行错误//判断id为imagegallery的元素是否存在,如果不存在的话网页任能正常运行if (document.getElementById("imagegallery")) {var gallery = document.getElementById("imagegallery");var placeholder = document.createElement("img"); //创建一个图片展示容器placeholder.setAttribute("id", "placeholder");placeholder.setAttribute("src", "../img/blank.jpg");var description = document.createElement("p"); //创建描述description.setAttribute("id", "description");var desctxt = document.createTextNode("chose an image");description.appendChild(desctxt);var body = document.getElementsByTagName("body")[0];body.appendChild(placeholder);body.appendChild(description);var links = gallery.getElementsByTagName("a"); //这里不加判断是因为如果你连图片都没有,何谈功能。for (var i = 0; i < links.length; i++) {links[i].onclick = function () {//showPic(this);//return false; 假设showPic方法没有出现问题,return false是正确的做法,但是万一shwPic出现了问题,这个时候返回false,点击超链接将没有任何反应,//所以这个地方这样该更好return !showPic(this); //如果showPic方法出现问题,超链接任然有效符合JavaSciprt平稳退化的要求; }}} } function showPic(whichpic) {var source = whichpic.getAttribute("href");//获取图片的链接地址placeholder.setAttribute("src", source);var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : ""; //获取图片名称(判断图片超链接的文本节点(图片名称)是否存在)document.getElementById("description").firstChild.nodeValue = text;return true; }

html代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title>
</head>
<body><div id="imagegallery"><a href="../img/index.jpg" title="dog_one">图片一</a><br /><a href="../img/index1.jpg" title="dog_two">图片二</a><br /><a href="../img/index2.jpg" title="dog_three">图片三</a><br /><a href="../img/index4.jpg" title="dog_four">图片四</a></div><script src="jsPic.js"></script>  <!--合理放置了JS脚本在加载完DOM后在加载JS脚本,提高了页面的加载速度,提现了内容优先的原则-->
</body>
</html>


这个版本的图片库的结构和行为分离的已经很彻底了,但是还是有个问题,因为这里的图片链接列表刚好是<body>部分的最后一个元素,如果在这个图片列表之后还有其他的一些元素?我们该怎么做?我们最初的想法是想让新创建的元素紧紧的跟在图片清单的后面,而且不管清单出现在哪个位置。所以这个图片库的版本还有待改进!

 

在学了通过insertAfter()和insertBefore()向指定元素位置的地方加入元素之后http://www.cnblogs.com/GreenLeaves/p/5731614.html

我们结合之前所有的学习内容对JS图片库再做一次改进,代码如下:

第六版:

utility.js  公共库

/*
window.onload事件(当页面加载完毕时需要调用的事件,也就是说当我们在开发中需要调用一些JS函数在页面加载完毕后执行的可以和这个事件绑定)
但是这个事件只能绑定一个函数,如果再次绑定原先的事件会被覆盖掉.所以这个方法就是将页面加载完毕之后需要的函数创建一个队列,然后将需要执行的函数一个个添加
到队列里面;
@param func  -需要添加到队列里面的函数
*/
function addOnloadEvent(func) {var oldonload = window.onload;if (typeof window.onload != "function") {window.onload = func; //如果window.onload事件没有绑定任何function则正常绑定
    }else {//如果window.onload事件已经绑定了函数,则在原来的基础上,继续添加新的函数window.onload = function () {oldonload();func();};}
}/*
addOnloadEvent的扩展版因为每次添加一个函数都需要调用addOnloadEvent()函数,所以为了节省代码,将需要绑定的函数名写入到一个数组里面,
然后将数组引用,传递给addOnloadEventlist();每次添加,只需将函数名,写到数组里面即可
@param eventlist  -需要与window.onload事件绑定的函数名数组
*/
function addOnloadEventlist(eventlist) {if (!eventlist) return false;var oldonload = window.onload;window.onload = function () {for (var i = 0; i < eventlist.length; i++) {eventlist[i]();}}}/*
向目标元素之后添加新的元素
@param newElement=新元素
@param targetElement=目标元素
*/
function insertAfter(newElement, targetElement) {/*编写逻辑1、首先找到给出我们需要插入的元素和用来定位的目标元素2、根据目标元素找到两个元素的父元素3、判断目标元素是不是父元素内的唯一的元素.4、如果是,向父元素执行追加操作,就是appendChild(newElement)5、如果不是,向目标元素的之后的紧接着的节点之前执行inserBefore()操作*/var parentElement = targetElement.parentNode; //find parent elementif (parentElement.lastChild == targetElement)//To determime确定,下决心 whether the last element of the parent element is the same as the target element 
    {parentElement.appendChild(newElement);} else {parentElement.insertBefore(newElement, targetElement.nextSibling);}
}

 

index.js

function showPic(whichpic) {if (!document.getElementById("placeholder")) return false;if (!document.getElementById("description")) return false;var placeholder = document.getElementById("placeholder");var description = document.getElementById("description");var source = whichpic.getAttribute("href"); //获取图片的链接地址placeholder.setAttribute("src", source);var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : ""; //获取图片名称(判断图片超链接的文本节点(图片名称)是否存在)if (description.firstChild.nodeType == 3) {description.firstChild.nodeValue = text;}else {return false;}return true;
}function preparePlaceholder() {if (!document.getElementById) return false;if (!document.createElement) return false;if (!document.createTextNode) return false;if (!document.getElementsByTagName) return false;//判断浏览器是否支持DOM方法防止浏览器不支持网页出现运行错误//判断id为imagegallery的元素是否存在,如果不存在的话网页任能正常运行if (document.getElementById("imagegallery")) {var gallery = document.getElementById("imagegallery");var placeholder = document.createElement("img"); //创建一个图片展示容器var description = document.createElement("p"); //创建描述var desctxt = document.createTextNode("chose an image");placeholder.setAttribute("id", "placeholder");placeholder.setAttribute("src", "../img/blank.png");description.setAttribute("id", "description");description.appendChild(desctxt);insertAfter(placeholder, gallery);insertAfter(description,placeholder);}
}
function prepareGallery() {if (!document.getElementById) return false;if (!document.getElementsByTagName) 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方法没有出现问题,return false是正确的做法,但是万一shwPic出现了问题,这个时候返回false,点击超链接将没有任何反应,//所以这个地方这样该更好return !showPic(this); //如果showPic方法出现问题,超链接任然有效符合JavaSciprt平稳退化的要求;
        }}
}
var eventlist = [preparePlaceholder, prepareGallery];
addOnloadEventlist(eventlist);

 

html文件:

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title><script src="../js/utility.js" type="text/javascript"></script> <script src="../js/index.js" type="text/javascript"></script>
</head>
<body><div id="imagegallery"><a href="../img/index.jpg" title="dog_one">图片一</a><br /><a href="../img/index1.jpg" title="dog_two">图片二</a><br /><a href="../img/index2.jpg" title="dog_three">图片三</a><br /><a href="../img/index4.jpg" title="dog_four">图片四</a></div>
</body>
</html>

现在图片库真正的做到了,结构、样式和行为彻底分离;

不过、这里还可以做下改进,将超链接的内容改成图片的缩略图、就是一个使用的图片库了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驰骋表单设计器 设计表单案例演示

为什么80%的码农都做不了架构师&#xff1f;>>> 我们以客户提供如下原始的word表单样本&#xff0c;使用驰骋表单设计器制作表单的过程介绍如下:工业设计和创意需求登记表原始表单图 在ccform表单设计器中&#xff0c;设计如下&#xff1a; 驰骋表单设计器&#xf…

jquery this 与javascript的this

<div class"list"><table><thead><tr><th width"110" rowspan"2">用户名id</th><th width"155" rowspan"2">用户名</th><th width"80" rowspan"2"…

这个避孕套让生活更和谐……

1 三连暴击▼2 开塞露还能这样用&#xff1f;▼3 这真不是打架&#xff1f;▼4 送礼佳品&#xff0c;必拉黑神器&#xff01;▼5 孩子&#xff1a;爹妈&#xff0c;真的可以再考虑一下的......▼6 四只手才能拆的避孕套▼7 谭警官&#xff1a;莫挨我&#xff01;&#xff…

WPF GridControl控件的用法举例

01—前言WPF中自带的表格控件是DataGrid&#xff0c;但是格式并不是很美观&#xff0c;我们一般用Dev中类似的控件GridControl来取代&#xff0c;这个控件功能相当强大。WPF数据网格&#xff08;GridControl&#xff09;是一个数据感知控件&#xff0c;用于以不同的布局显示和编…

Android之如何ubuntu环境下在手机里面快速找到apk的位置然后拉下来

1、在手机里面通过包名找到APK的位置 adb shell pm list packages -f | grep acr -f 是文件路径的意思acr是过滤包名的apk名字结果显示package:/data/app/com.nll.acr-1/base.apkcom.null.acr2、得到apk路径之后&#xff0c;修改名字,拉倒本地 adb pull /data/app/com.nll.acr-…

《黑书》hdu1271递推习题:整数对

我能说这道题目被黑书坑了吗&#xff1f;这是递推题&#xff1f;......好吧&#xff0c;那么我是的确没有想到这样去做的。只是想着&#xff0c;可以枚举缺少的位&#xff0c;然后用搜索去解决.......但是我仔细思考&#xff0c;觉得用搜索太麻烦了&#xff0c;要处理很多细节&…

推荐我看过的几本好书给大家!(2)

继续从亚马逊盗图&#xff01;哈哈&#xff01; 这本书感觉很不错&#xff0c;对于算法&#xff0c;个人觉得还是需要掌握的&#xff0c;毕竟你不可能一辈子都做最底层的程序员吧&#xff0c;想要获得提升&#xff0c;一方面是经验的积累&#xff0c;另外一方面则是一种厚积薄发…

《SAS编程与数据挖掘商业案例》学习笔记之十四

继续《SAS编程与数据挖掘商业案例》学习笔记系列&#xff0c;本次重点&#xff1a;常用全程语句 所谓全程语句&#xff0c;是指可以用在任何地方的sas语句&#xff0c;既可以用在data数据步语句里面&#xff0c;也可以用在proc过程步里面&#xff0c;甚至可以单独使用&#xff…

细聊.NET6 ConfigurationManager的实现

前言友情提示:建议阅读本文之前先了解下.Net Core配置体系相关&#xff0c;也可以参考本人之前的文章《.Net Core Configuration源码探究 [1]》然后对.Net Core的Configuration体系有一定的了解&#xff0c;使得理解起来更清晰。在.Net6中关于配置相关多出一个关于配置相关的类…

activemq安全设置 设置admin的用户名和密码

ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件&#xff0c;找到 <bean id"securityConstraint" class"org.eclipse.jetty.http.security.Constraint"> <property name"name" value"BASIC" /> <p…

Android之在ubuntu上常用的am、pm命令的总结

adb shell am instrument [options] <COMPONENT> 作用&#xff1a;启动对instrument实例的监视。 参数[options]&#xff1a; -e <key> <value> // -e选项需要放在-w选项之前 作用&#xff1a;提供了以键值对形式存在的测试选项。Android中提供了多种键值对&…

转:IOS开发之----Xcode非ARC项目中设置部分文件ARC支持

ARC是什么 ARC是iOS 5推出的新功能&#xff0c;全称叫 ARC(Automatic Reference Counting)。简单地说&#xff0c;就是代码中自动加入了retain/release&#xff0c;原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。该机制在 iOS 5/ Mac OS X 10.…

将数据库设置为运行在限制模式下

将数据库设置为运行在限制模式下 如果要维护数据库的结果或者要对数据库进行数据的导出导入操作时&#xff0c;此时应该尽量限制其他会话进程&#xff0c;保证数据库的操作运行在安全状态下。同时对使用数据的库的用户也可以起到避免读取脏数据的bug。将数据库上的其他用户进程…

《SAS编程与数据挖掘商业案例》学习笔记之十六

《SAS编程与数据挖掘商业案例》学习笔记&#xff0c;本次重点&#xff1a;sas宏变量 内容包括&#xff1a;宏变量、宏函数、宏参数、通配函数、字符函数、计算函数、引用函数、宏语句、宏应用 1.宏触发器&#xff1a; %name-token:是一个宏语句或宏函数 &name-token:是一个…

C# ActionT和 FuncT委托

除了为每个参数和返回类型定义一个新委托类型之外&#xff0c;还可以使用 Action<T> 和 Func<T>委托。泛型 Action<T>委托表示引用一个 void 返回类型的方法。这个委托类存在不同的变体&#xff0c;可以传递至多 16 种不同的参数类型。没有泛型参数的 Action…

linux学习-简单命令介绍及安装VMware Tools

常用简单命令介绍 ethernet以太网pts&#xff1a;模拟终端图形界面&#xff1a;CtrlAltF1 字符界面&#xff1a;CtrlAltF2-F6切换虚拟终端&#xff1a;&#xff08;本机操作&#xff09;# chvt 1-6关闭图形界面,在纯字符界面下操作&#xff1a; init 3打开图形界面&#xff…

Android之6.0 权限申请封装

之前一篇博客初试了Android6.0系统的动态权限申请&#xff0c;成功之后开始思考将权限申请功能封装以供更加方便的调用。 查阅6.0系统权限相关的API&#xff0c;整个权限申请需要调用三个方法&#xff1a; 1. ContextCompat.checkSelfPermission() 检查应用是否拥有该权限&a…

Samba服务器问题汇总

一个Samba服务器要么经典模式访问&#xff08;用户名密码&#xff09;&#xff0c;要么友好访问&#xff08;guest&#xff09;&#xff0c;只可选其一。㈠准备工作&#xff1a;1>清除客户端windows系统的上次访问自动记录CMD下运行&#xff1a;net use * /delete /y2>关…