编写兼容性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代码,如需转载请自行联系原博主。

时间: 2024-09-22 02:30:12

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

jsp-JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答

问题描述 JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答 背景: 楼主使用Myelipse新建了一个Web项目,在编写一个JSP文件的时候遇到一个问题,首先是使用了img,并且写了一个事件,代码如下: <imgclass="poke" src="poke/back.jpg" title="hit" id="play_id_3" onClick="change_pic()&qu

utf-8-在网页中编写js代码并运行

问题描述 在网页中编写js代码并运行 这是代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>在网页中编写代码并运行</title> </head> <body> <div align="center"> <textarea id=&quo

js 兼容性-有个js代码,火狐浏览器可以实现,谷歌不行,求解决

问题描述 有个js代码,火狐浏览器可以实现,谷歌不行,求解决 用js写了一个切换样式的(用下拉框选择样式切换).但是在火狐浏览器可以实现切换,在谷歌和360浏览器就没有反应.求教大神指导.下面是有关代码,有些没有关系的我就删了. //皮肤样式切换 function switchStylestyle(styleName){ aa=document.styleSheets; for(i=0;i<aa.length;i++){ aa[i].disabled=true; if(aa[i].title==

javascript-怎样编写完整的网站js代码?

问题描述 怎样编写完整的网站js代码? 看了一下大型的网站,好像他们的js代码好复杂.同样的效果和我平时写的代码不一样,例如tab菜单切换(京东首页的三级菜单)这些 还有所有的js是不是用匿名函数写的? 解决方案 你要什么功能就编写,公用的功能同一个到一个js文件里面,script导入即可,不需要每个页面都放. 你写匿名函数干嘛,一般都有名字的,要不你怎么调用.匿名函数一般是防止变量污染用的,如下面 var a=1 (function(){ var a=2; alert(a)//2 })() a

最佳JS代码编写的14条技巧_javascript技巧

写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的,下面是来自Javascript Toolbox发布的14条最佳JS代码编写技巧. 1. 总是使用 var 在javascript中,变量不是全局范围的就是函数范围的,使用var关键词将是保持变量简洁明了的关键.当声明一个或者是全局或者是函数级(function-level)的变量,需总是前置var关键词,下面的例子将强调不这样做潜在的问题. 不使用 Var 造成的问题 var i=0; // This is good - crea

如何编写高质量JS代码(续)_javascript技巧

继续上一篇文章<如何编写高质量JS代码>今次整理一下javascript函数知识点. 2.使用函数 函数给程序员提供了主要的抽象功能,又提供实现机制.函数可以独立实现其他语言中的多个不同的特性,例如,过程.方法.构造函数,甚至类或模块. 2.1 理解函数调用.方法调用以及构造函数调用之间的不同 针对面向对象编程,函数.方法和类的构造函数是三种不同的概念. 使用模式: 1,函数调用 复制代码 代码如下: function hello(username){     return "hel

多浏览器兼容性比较好的复制到剪贴板的js代码_javascript技巧

对于非ie浏览器他是用flash来实现的,js代码如下: 复制代码 代码如下: <script type="text/javascript"> function copy_code(copyText) { if (window.clipboardData) { window.clipboardData.setData("Text", copyText) } else { var flashcopier = 'flashcopier'; if(!docum

timer-关于右下角跟随悬浮框疑问,下列的js代码为什么在IE中有效果而FF中没有?该怎样解决?

问题描述 关于右下角跟随悬浮框疑问,下列的js代码为什么在IE中有效果而FF中没有?该怎样解决? window.onscroll=function(){ var oDiv=document.getElementById('div1'); var scrollTop=document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; //oDiv.style.top=document.docume

让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]

前言       上文让JS代码折叠的功能能用了,本文将对代码继续改进以期更好用.更实用,随后有介绍Visual Studio JS方面的几个插件.   文章       1.      VS2003折叠代码的Micro       2.      MSDN       3.      Document Outline for Client Script in Visual Studio 2005   正文       一.继续上文改造,主要是支持region 后面跟注释和显示注释 1.1 效果