zoukankan      html  css  js  c++  java
  • 实践javascript美术馆的小案例,学习到的东西还是蛮多的,包括javascript编程中的预留退路、分离javascript、以及实现向后兼容等

    javascript美术馆(改进2)

    一、javascript编程过程中的好习惯

    1、实现预留退路

    js被禁掉,图片也可以显示出来,href属性带有图片路径

    <script src="js/showPic.js"></script>
            <h1>Snapshots</h1>
            <ul id="imagegallery">
                <li><a href="images/01.jpg" title="01 display"><img width="100px" src="images/01.jpg" alt="01"/></a></li>
                <li><a href="images/02.jpg" title="01 display"><img width="100px" src="images/02.jpg" alt="01"/></a></li>
                <li><a href="images/03.jpg" title="01 display"><img width="100px" src="images/03.jpg" alt="01"/></a></li>
            </ul>

    通过专用的id,图片的点击显示在单独的js文件中处理。

    上面的代码就做到了我们在编程过程中所说的预留退路。因为在上面的href链接 中,我们写全了图片的路径,这样即使用户禁用了javascript,但是我们预留了退路,所以在没有javascript“干扰”的情况下,浏览器将沿着href属性给出的连接前进,用户看到了新图片而不是“该页无法显示”之类的信息。虽然这样与javascript在当前页面上进行切换的显示效果略差,但是总比什么都不显示强很多。

    2、实现分离javascript

        外部文件里完成添加onclick事件处理函数的工作,那样才能让我们的html文档没有“杂质。

    仍然是上面的代码,把点击图片的js代码全部放到了外部的js文件中,这样关联起来全靠一个独一无二的id号。


    3、实现向后兼容

         进行必要的检查,确保老浏览器不会因为我们的javascript脚本而死机,

    例如:if (!document.getElementsByTagName) return false                         //对象检测,如果浏览器不支持,就立即退出,不执行。

    二、搞懂了的问题

    1、return false;

    <a href="javascript:showPic('images/coffee.jpg'); return false" title="A cup of coffee">Coffee</a>

    return false这个语句的作用,就是阻止浏览器的默认行为不发生

    当点击这个链接时,因为onclick事件处理函数所触发的javascript代码返回给它的值是false,所以这个链接 在被点击时默认行为将不会发生。

    同样,onclick="showPic(this);return false;"加了return false后可以不让用户被他们所点击的链接带到另一个图片查看窗口去。

    2、document.body(专用记号)

    等价于一下:

    var body_element = document.getElementByTagName("body")[0];

    3、结构化设计原则

    每个函数应该只有一个入口和一个出口。

    4、如何将多个javascript函数绑定到onload事件处理函数上

    法一:匿名函数

    window.onload = function(){

       firstFun();

       secondFun();

    }

    法二:

    自己编写代码(写一个判断函数)

    如果未加载,就加载事件函数;如果已加载,则追加到后面。!!注意:要把window.onload事件处理函数的值放进oldonload中

    function addLoadEvent(func){
        var oldonload = window.onload;
        if(typeof window.onload != 'function'){  //判断页面是否已加载  ,已加载的话就追加到后面
            window.onload = func;          
        }else{
            window.onload = function(){
                oldonload();                      //
                func();
            }
        }
    }

    三、javascript美术馆(改进)全部代码

    gallery.html文件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title></title>
            <link rel="stylesheet" href="style/css/gallery.css" type="text/css" />
            <script src="js/showPic.js"></script>
        </head>
        <!--
            作者:1107989194@qq.com
            时间:2014-04-14
            描述:javascript美术馆
            占位符、动态创建元素、
            1、实现预留退路 (js被禁掉,图片也可以显示出来,href属性带有图片路径)
            2、实现分离javascript(外部文件里完成添加onclick事件处理函数的工作,那样才能让我们的html文档没有“杂质)
            3、实现向后兼容(进行必要的检查,向后兼容性if (!document.getElementsByTagName) return false)
        -->
        <body>
            <h1>Snapshots</h1>
            <ul id="imagegallery">
                <li><a href="images/01.jpg" title="01 display"><img width="100px" src="images/01.jpg" alt="01"/></a></li>
                <li><a href="images/02.jpg" title="01 display"><img width="100px" src="images/02.jpg" alt="01"/></a></li>
                <li><a href="images/03.jpg" title="01 display"><img width="100px" src="images/03.jpg" alt="01"/></a></li>
            </ul>
        </body>
    </html>

    css文件

    *{
        margin: 0;
        padding: 0;
        border: 0px;
        list-style: none;
    }
    body{
        font-family:"arial, helvetica, 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;
    }
    ul{
        padding: 0;
    }
    li{
        float: left;
        padding: 1em;
        list-style: none;
    }
    #imagegallery{
        list-style: none;
    }
    #imagegallery li{
        display: inline;
    }
    
    #imagegallery li a img{
        border: 0px;
    }

    js文件:

    /***********判断页面是否已加载事件的函数********************************/
    function addLoadEvent(func){
        var oldonload = window.onload;
        if(typeof window.onload != 'function'){  //判断页面是否已加载  ,已加载的话就追加到后面
            window.onload = func;          
        }else{
            window.onload = function(){
                oldonload();                      //
                func();
            }
        }
    }
    
    /***********自定义函数   将元素插入到一个元素的后面************************/
    function insertAfter(newElement,targetElement){
        var parent = targetElement.parentNode;
        
        if(parent.lastChild == targetElement){
            parent.appendChild(newElement);        
        }else{
            parent.insertBefore(newElement,targetElement.nextSibling);
        }
    }
    
    
    /***************动态创建  占位符 ***********************************/
    function preparePlaceholder(){
        if(!document.createElement) return false;      //对象检测    如果浏览器不支持,则停止执行并返回false
        if(!document.createTextNode) return false;
        if(!document.getElementById) return false;
        if(!document.getElementById('imagegallery')) return false;
        
        var placeholder = document.createElement('img');
        placeholder.setAttribute('id','placeholder');
        placeholder.setAttribute('src','images/placeholder.jpg');
        placeholder.setAttribute('width','400px');
        placeholder.setAttribute('alt','my image gallery');
        
        var description = document.createElement('p');
        description.setAttribute('id','description');
        var desctext = document.createTextNode('choose an image');
        description.appendChild(desctext);
        var gallery = document.getElementById('imagegallery');
        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');   //根据它的父级元素,找到所要的a标签,缩短查找事件(即使通过tagName可直接找到所有的a标签)
        var links = gallery.getElementsByTagName('a');
        for(var i =0; i<links.length; i++){
            links[i].onclick = function(){
                return showPic(this);
            }
            links.onkeypress = links[i].onclick;
        }
    }
    
    /**************显示图片********************************************/
    function showPic(whichpic){
        if(!document.getElementById('placeholder')) return false;  //对象检测
        var source = whichpic.getAttribute('href');
        var placeholder = document.getElementById('placeholder');
        placeholder.setAttribute('src',source);
        
        
        if(!document.getElementById('description')) return false;
        if(whichpic.getAttribute('title')){
            var text = whichpic.getAttribute('title');
        }else{
            var text = '';
        }
        
        var description = document.getElementById('description');
        if(description.firstChild.nodeType == 3){
            description.firstChild.nodeValue = text;
        }
        return false;
    }
    
    addLoadEvent(preparePlaceholder);
    addLoadEvent(prepareGallery);
  • 相关阅读:
    基础总结深入:数据类型的分类和判断(数据、内存、变量) 对象 函数 回调函数 IIFE 函数中的this 分号
    BOM 定时器 通过修改元素的类来改变css JSON
    事件 事件的冒泡 事件的委派 事件的绑定 事件的传播
    DOM修改 使用DOM操作CSS
    包装类 Date Math 字符串的相关的方法 正则表达式 DOM DOM查询
    数组 call()、apply()、bind()的使用 this arguments
    autocad 二次开发 最小包围圆算法
    win10 objectarx向导在 vs2015中不起作用的解决办法
    AutoCad 二次开发 jig操作之标注跟随线移动
    AutoCad 二次开发 文字镜像
  • 原文地址:https://www.cnblogs.com/wuyinghong/p/3664987.html
Copyright © 2011-2022 走看看