编写兼容性JS代码

简介:

前文介绍了:

  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="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>
复制代码

 

本文转自博客园xingoo的博客,原文链接:编写兼容性JS代码,如需转载请自行联系原博主。
相关文章
|
23天前
|
JavaScript
短小精悍的js代码
【10月更文挑战第17天】
119 58
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。
【10月更文挑战第7天】随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这两个工具,可以确保代码风格一致,提升团队协作效率和代码质量。
218 2
|
1月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
34 0
|
2月前
|
编解码 前端开发 JavaScript
javascript检测网页缩放演示代码
javascript检测网页缩放演示代码
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
10天前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
24 3
原生js炫酷随机抽奖中奖效果代码
|
15天前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
163 4
|
17天前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
66 6
|
13天前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
41 1