zoukankan      html  css  js  c++  java
  • JavaScript DOM高级程序设计1.2-循序最佳实践--我要坚持到底!

    我这人,最大的毛病就是浮躁。

    下面开始我再一次的学习之旅,希望我能坚持到最后。记笔记除了分享以外,更重要的是让自己看见自己学习之路。

    先把ADS库贴出来http://vdisk.weibo.com/s/DaX18

    把行为从结构中分离出来
    全部脚本,都使用外部源文件,就当其他方式没有了解过。
    昔日的javascript:前缀。(相对合理的写法。) 
     

    <script type="text/javascript">
            function popup(url) {
                window.open(url);
                //do not return anything!
            }
    </script>
    <a href="http://advanceddomscripting.com" onclick="popup(this.href); return false;">


      但是可以通过在文档中包含popupLoadEvent.js这样的脚本文件来应用与嵌入式脚本相同的逻辑(ADS库,稍后创建。先有这种思想。)

     

    //添加载入事件来修改页面
    ADS.addEvent(window,'load',function(W3CEvent) {
        
        //查找文档中带popup类的所有锚的标签
        var popups = ADS.getElementsByClassName('popup', 'a');
        for(var i=0 ; i<popups.length ; i++ ) {
            //为每个锚添加单击事件侦听器
            ADS.addEvent(popups[i],'click',function(W3CEvent) {
                
                //使用href属性打开窗口
                window.open(this.href); 
                
                //取消默认事件
                ADS.eventPreventDefault(W3CEvent);
            });
        }
    });

       然后在class属性中加上popup类标记出相应的锚:<a href="http://advanceddomscripting.com" class="popup">
      另外一个好处就是,通过相同的类名添加独特的样式 

    .popup {
        padding-right: 25px;
        background: transparent url(images/popup.png) no-repeat right center;
    }View Code

    不要版本检测
    使用能力检测
    使用版本检测的范例:

    if(pitcher.screwball){
        pitcher.screwball.throw();      
    }else if (pitcher.fastball){
        pitcher.fastball.throw();  
    }else{
         alert('Sorry,you can't throw the ball.');   
    }

    使用能力检测,指的是在执行代码之前检测某个脚本对象或者方法是否存在,而不是依赖于你对哪个浏览器具有那些特性的了解:

    if (pitcher.screwball)
    {
        pitcher.screwball.throw();
    }
    else if (pitcher.fastball)
    {
        pitcher.fastball.throw();
    }
    else
    {
        alert("Sorry,you can't throw the ball.");
    }

    类是的,如果你代码里需要document.body,你就应该想下面这样进行检测

    if(documen.body)
    {
        //依赖document.body的代码
    }

    当然不是所有的函数和方法都要检测,你只要在脚本开始处对你打算使用的对象和方法进行检测:

    var W3CDOM = document.createElement&&document.getElementsByTagName;
    function exampleFunctionThatRequiresW3CMethods()
    {
        if (!W3CDOM)
        {
            return;
        }
        //使用document.createElement()和document.getElementsByTagName()的代码
        
    }

    通过平稳退化保证可访问性
    为重用命名空间而进行规划
    保持唯一性
    不共享 

    (function()
    {
        function $(id)
        {
            return document.getElementById(id);
        }
        function alertNodeName(id)
        {
            alert($(id).nodeName);
        }
        window['myNamespace']={};
        window['myNamespace']['showNodeName']=alertNodeName;
    }
    )();

    这样就可调用:myNaespace.showNodeName('example');

    通过可重用的对象把事情简化(本书是通过创建ADS库贯穿的) 

    (function()
    {
        //ADS命名空间
        if (!window.ADS)
        {
            window['ADS']={};
        }
    }
    //确定当前类库是否与整个浏览器兼容
    function isCompatible(other)
    {
        //使用能力检测来检查必要条件
        if (other==false
            ||!Array.prototype.push
            ||!Object.hasOwnProperty
            ||!document.createElement
            ||!document.getElementsByTagName)
        {
            return false;
        }
        return true;
    }
    window['ADS']['isCompatible']=isCompatible;
    
    /*
    if(ADS.isCompatible())
    {
        //使用ADS库的代码
    }
    */
    
    function $()
    {
        var elements=new Array();
        //查找作为参数提供的所有元素
        for (var i  = 0;i<arguments.length ;i++ )
        {
            var element=arguments[i];
            //如果该参数是一个字符串那假设他是一个id
            if(typeof element="string")
            {
                element=document.getElementById(element);
            }
            //如果只提供一个参数,则立即返回这个元素
            if (arguments.length==1)
            {
                return element;
            }
            //否则将他添加到数组中
            elements.push(element);
        }
        //返回包含多个被请求的数组
        return elements;
    };
    window['ADS']['$']=$;
    
    /*
    var element=ADS.$('example');
    */
    /*
    var elements = ADS.$('a','b','c','d')
    for(e in elements)
    {
        //执行某些操作
    }
    */
    
    function addEvent(node,type,listener)
    {
        //使用前方法检查兼容性以保证平稳退化
        if (!isCompatible())
        {
            return false;
        }
        if (!(node=$(node)))
        {
            return false;
        }
        if (node.addEventListener)
        {
            //W3C的方法
            node.addEventListener(type,listener,false);
            return true;
        }
        else if (node.attachEvent)
        {
            //MSIE的方法
            node['e'+type+listener]=listener;
            node[type+lisener]= function()
            {
                node['e'+type+listener](window.event);
            }
            node.attachEvent('on'+type,node[type+listener]);
            return true;
        }
        //若两种方法都不具备则返回false;
        return false;
    };
    window['ADS']['addEvent']=addEvent;
    
    /*实例
    ADS.addEvent(window,'load',function(W3CEvent))
    {
        //查找文档中所有带popup类的锚标签
        var popup=ADS.getElementsByClassName('popup','a');
        for(var i= 0;i<popups.length;i++)
        {
            //给每个锚添加一个事件侦听器
            ADS.addEvent(popup[i],'click',function(W3CEvent))
            {
                //使用href属性打开窗口
                window.open(this.href);
                //取消默认事件
                ADS.eventPreventDefault(W3CEvent);
            });
        }
    });
    //甚至可以添加多个事件
    function sayHello(){alert('Hello');
    }
    ADS.addEvent(window,'load',sayHello);//注意 ,不包含on
    
    function sayGoodBye()
    {
        alert('GoodBye!');
    }
    ADS.addEvent(window,'load',sayGoodBye)
    */
    function removeEvent(node,type,listener)
    {
        if (!(node=$(node)))
        {
            return false;
        }
        if (node.removeEventListener)
        {
            //W3C的方法
            node.removeEventListener(type,listener,false);
            return true;
        }
        else if (node.detachEvent)
        {
            //MSIE的方法
            node.detachEvent('on'+type,node[type+listener]);
            node[type+listener]=null;
            return true;
        }
        //若两种方法都不具备则返回false;
        return false;
    };
    window['ADS']['removeEvent']=removeEvent;
    
    function getElementByClassName(className,tag,parent)
    {
        parent=parent||document;
        if (!(parent=$(parent)))
        {
            return false;
        }
        //查找所有匹配的标签
        var allTags=(tag=="*"&&parent.all)?parent.all:parent.getElementsByTagName(tag);
        var matchingElements=new Array();
    
        //创建一个正则表达式。来判断className是否正确。
        className=className.replace(/-/g,"\-");
        var regex=new RegExp("(^|\s)"+className+"(\s|$)");
    
        var element;
        //检查每个元素
        for (var i=0; i<allTags.length;i++ )
        {
            elemetn=allTags[i];
            if (regex.test(element.className))
            {
                matchingElements.push(element);
            }
        }
        //返回任何匹配的元素
        return matchingElements;
    };
    window['ADS']['getElementByClassName']=getElementByClassName;
    /*范例
    ...
    <p class="findme"> This is just an <em calss="findme">example</em><p>
    <div id="theList">
        <h2 class="findme">A list
        </h2>
        <ol>
            <li class="findme">foo
            </li>
            <li class="findme">bar
            </li>
        <ol>
    </div>
    */
    //切换显示
    function toggleDisplay(node,value)
    {
        if (!(node=$(node)))
        {
            return false;
        }
        if (node.style.display!='none')
        {
            node.style.display='none';
        }
        else{
            node.style.display=value||'';
        }
        return true;
    };
    window['ADS']['toggleDisplay']=toggleDisplay;
    /*实例
    ADS.toggleDisplay(ADS.$('example'));
    */
    
    function insertAfter(node,refereceNode)
    {
        if (!(node=$(node)))
        {
            return false;
        }
        if(!(referenceNode=$(referenceNode))) return false;
        return referenceNode.parentNode.insertBefore(
            node,referenceNode.nextSibling    
        );
    };
    /*实例
    ADS.insertAfter(ADS.$('example'),domNode);
    比下面的容易多:
    ADS.$('example').parentNode.insertBefore(ADS.$('example'),domNode);
    */
    window['ADS']['insertAfter']=insertAfter;
    
    function removeChildren(parent)
    {
        if (!(parent=$(parent)))
        {
            return false;
        }
        //当存在子节点是删除该子节点
        while(parent.firstChild)
        {
            parent.firstChild.parentNode.removeChild(parent.firstChild)
        }
        return parent;
    };
    window['ADS']['removeChildren']=removeChildren;
    
    //prepend追加在前
    function prependChild(parent,newChild)
    {
        if (!(parent=$(parent)))
        {
            return false;
        }
        if (parent.firstChild)
        {
            //如果存在一个子节点,则在这个子节点之前插入
            parent.insertBefore(newChild.parent.firstChild);
        }
        else{
            parent.appendChild(newChild);
    
        }
        return parent;
    };
    window['ADS']['prependChild']=prependChild;
    )();

    一定要自己动手写代码

  • 相关阅读:
    调用其他类函数,且其他类函数使用自己脚本的成员变量的方法
    伟程君解决端口被占用问题(接口jmeter 本地端口被占用完了,jmeter报错的问题)(亲测是可以的)
    JMeter 使用 http长连接的方法
    解决端口被占用问题(端口timewait)
    光辉岁月吉他指弹
    Jmeter获取 json字符的另外一种写法
    Jmeter-Critical Section Controller(临界区控制器)(还没看,是一个控制请求按顺序执行的东东)
    wrk一个能做模拟高并发请求的东东
    017-mac下project
    016-mac下ps
  • 原文地址:https://www.cnblogs.com/sunhan/p/3542350.html
Copyright © 2011-2022 走看看