前文介绍了:

  1 DOM四个常用的方法

  2 使用DOM核心方法完成属性填充

本篇主要介绍在JS中需要注意的几个地方,另外为了减小html与javascript的耦合使用java进行onclick方法编写。

  其实javascript不是一门简单的语言,但是由于入门简单,很多人使用的时候,都是直接复制粘贴,导致网页中充斥着大量的冗余代码。

  但是在编写合格的javascript代码时,需要注意:

  1 平稳退化:保证在不支持js或者低版本的浏览器也能正常访问

  2 分离javascript:把html与javascript分离,有助于后期代码的维护

  3 向后兼容性:确定老版本的浏览器不会因为脚本禁止而死掉

  4 性能考虑:确定脚本执行的最优

  编写优化的代码

  针对前一篇中的相册的代码,这里主要修改的地方是把onclick方法删除,在页面加载时,利用onload方法,动态的为a标签添加onclick方法。

  以前的onclick标签处,是这样的:

        <ul>
<li>
<a href="images/pig.png" title="I'm pig!" onclick="showPic(this);return false;">Pig</a>
</li>
<li>
<a href="images/rabit.png" title="I'm rabit!" onclick="showPic(this);return false;">Rabit</a>
</li>
<li>
<a href="images/house.png" title="I'm house!" onclick="showPic(this);return false;">house</a>
</li>
<li>
<a href="images/monkey.png" title="I'm monkey!" onclick="showPic(this);return false;">monkey</a>
</li>
</ul>

  执行脚本处,是这样的:

            function showPic(whichPic){
var source = whichPic.getAttribute("href");
var placeHolder = document.getElementById("placeHolder");
placeHolder.setAttribute("src",source); var text = whichPic.getAttribute("title");
var description = document.getElementById("description");
description.firstChild.nodeValue = text;
}

  现在为了避免在html中涉及到过多的javascript代码,即onclick事件,直接给ul设置一个id。然后动态的添加方法:

        <ul id="imagegallery">
<li>
<a href="images/img1.jpg" title="test1">img1</a>
</li>
<li>
<a href="images/img2.jpg" title="test2">img2</a>
</li>
</ul>

  javascript的代码如下:

            function addLoadEvent(func){
var oldonload = window.onload;
//如果onload还没有添加任何的方法,则把参数方法传给它;否则在它的函数方法后面,在添加方法
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function(){
oldonload();
func();
}
}
} 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)?false:true;
}
//如果使用键盘回车时,触发onkeypresss()方法
//links[i].onkeypress = links[i].onclick;
}
} function showPic(whichPic){
//安全性检查,如果没有该节点,直接返回false
if(!document.getElementById("placeHolder")) return false; var source = whichPic.getAttribute("href");
var placeHolder = document.getElementById("placeHolder");
//检查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");
//文本节点的节点类型是3
if(description.firstChild.nodeValue == 3){
description.firstChild.nodeValue = text;
}
}
return true;
} addLoadEvent(prepareGallery);

  上面部分的代码,添加了很多的安全性检查和兼容性,另外一个就是优化onload方法。

  效果与前篇类似,全部代码如下:

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>我的相册</title> <style type="text/css">
body {
font-family: "Helvetica","Arial",sans-serif;
color: #333;
background-color: #ccc;
margin: 1em 10%;
}
h1 {
color:#333;
background-color: transparent;
}
a {
color:#c60;
background-color: transparent;
font-weight: bold;
text-decoration:none;
}
li {
float: left;
padding: 1em;
list-style: none;
}
img {
clear:both;
display: block;
}
</style>
</head>
<body>
<h1>我的相册</h1>
<ul id="imagegallery">
<li>
<a href="images/img1.jpg" title="test1">img1</a>
</li>
<li>
<a href="images/img2.jpg" title="test2">img2</a>
</li>
</ul> <img id="placeHolder" alt="image" src="data:images/img1.jpg"/> <p id="description">Choose an image.</p> <script type="text/javascript"> function addLoadEvent(func){
var oldonload = window.onload;
//如果onload还没有添加任何的方法,则把参数方法传给它;否则在它的函数方法后面,在添加方法
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function(){
oldonload();
func();
}
}
} 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)?false:true;
}
//如果使用键盘回车时,触发onkeypresss()方法
//links[i].onkeypress = links[i].onclick;
}
} function showPic(whichPic){
//安全性检查,如果没有该节点,直接返回false
if(!document.getElementById("placeHolder")) return false; var source = whichPic.getAttribute("href");
var placeHolder = document.getElementById("placeHolder");
//检查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");
//文本节点的节点类型是3
if(description.firstChild.nodeValue == 3){
description.firstChild.nodeValue = text;
}
}
return true;
} addLoadEvent(prepareGallery);
</script>
</body>
</html>

编写兼容性JS代码的更多相关文章

  1. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  2. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!

    原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...

  3. [MIP]mip-script组件自定义 JS 代码使用限制

    自mip升级v2版本后,多了一个mip-script组件,很多人就都以为可以写自定义js代码了!然并卵,MIP2页中还是一样不允许自定义javascript代码,所有的交互须通过组件实现. 引用官方说 ...

  4. 编写高质量JS代码的68个有效方法(七)

    [20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  5. 编写高质量JS代码的68个有效方法(十三)

    No.61.不要阻塞I/O事件队列 Tips: 异步API使用回调函数来延缓处理代价高昂的操作以避免阻塞主应用程序 JavaScript并发的接收事件,但会使用一个事件队列按序地处理事件处理程序 在应 ...

  6. 编写高质量JS代码的68个有效方法(八)

    [20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  7. 编写高质量JS代码的68个有效方法(六)

    [20141213]编写高质量JS代码的68个有效方法(六) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  8. 编写高质量JS代码的68个有效方法(四)

    [20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  9. 编写高质量JS代码的68个有效方法(三)

    [20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

随机推荐

  1. phpcms v9 下拉菜单 二级 三级子栏目调用方法

    很多网站的导航栏可以实现下拉二级菜单,三级菜单等效果,今天我们就来分享phpcms v9 支持下拉菜单的方法,可以支持无限子栏目调用,具体写法如下: <ul> {pc:content ac ...

  2. Sample MultipleFileWordcount CombineFileInputFormat

    在旧版本的samples中,使用的是旧的api,mapred下面的MultiFileInputFormat,现在已经过时. 现在推荐使用mapreduce下面的CombineInputFormat来处 ...

  3. C自学笔记-递归与迭代的使用方法笔记与两者的使用场合

    递归和迭代在刚开始学C语言的时候就学过,但是不知道怎么使用.今天遇到一个题目分析过后 我瞬间想起来之前学过递归的方法,做完题后顺便翻了翻书整理了这个笔记.题目大概是这样的. 题目:猴子吃桃问题:猴子第 ...

  4. openfire+asmack搭建的安卓即时通讯(一) 15.4.7

    最进开始做一些android的项目,除了一个新闻客户端的搭建,还需要一个实现一个即时通讯的功能,参考了很多大神成型的实例,了解到operfire+asmack是搭建简易即时通讯比较方便,所以就写了这篇 ...

  5. CORDIC原理与FPGA实现(1)

    CORDIC算法的来历与用途大家网上随处可以见到,这里写 一下自己的理解. 将P(x,y)旋转角度a得到新的坐标P’(x’,y’).这里的坐标变换为: x’= x cos(a) – y sin(a)  ...

  6. Docker tips

    1.将Docker daemon的监听端口写入配置文件 配置文件: /etc/default/docker (CentOS: /etc/sysconfig/docker) 写入:DOCKER_OPTS ...

  7. 边工作边刷题:70天一遍leetcode: day 85

    Find the Celebrity 要点: 这题从solution反过来想比较好:loop through n同时maintain一个candidate:如果cand认识某个i,那么modify c ...

  8. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  9. UESTC 32 树上战争(Battle on the tree)

    这题其实很简单,每个人肯定都往上走,才能保证尽快赢,所以无非是看谁离根节点近,即深度小..用并查集中的findset思想,不断找父节点一直到根节点来找深度就可以了. 代码: #include < ...

  10. 用js判断时间的先后顺序

    我们在用户注册信息的时候,有时根据需要往往要加入一些时间上的判断,今天我在这里给大家推荐一款比较实用的时间先后顺序判断的代码,希望对大家有所有帮助. <!DOCTYPE HTML> < ...