美文网首页
JS:day09

JS:day09

作者: AnnQi | 来源:发表于2017-08-14 18:49 被阅读0次

    一、JavaScript 的分层概念 和 JavaScript 库

    JavaScript分层(从下往上)

    ①base层:

    位于最低端,负责封装不同浏览器下JavaScript的差异,提供统一接口;也可以给上两层提供接口。

    ②common层:

    位于中间端,依赖base层提供的接口,功能是给上一层提供组件。

    ③page层:

    位于最顶端,功能是来完成页面内的功能需求。

    base层(查看 IE 和 Firefox 的区别)

    1.以下IE会弹出 item2,Firefox 会弹出 undefined ;两行注释IE会弹出 1 和 3;Firefox会弹出 3 和 7

    <ul>
        <li id="item1"></li>
        <li id="item2"></li>
        <li id="item3"></li>
    </ul>
    
    <script>
        var item1 = document.getElementById("item1");
        alert(item1.nextSibling.id);
    //    alert(item1.nextSibling.nodeType);  弹出 类型为文本节点3
    //    alert(document.getElementsByTagName("ul")[0].childNodes.length);   弹出ul的全部子节点 7
    </script>
    

    2.以下把空格和换行去掉会弹出一致的 item2

    <ul><li id="item1"></li><li id="item2"></li><li id="item3"></li></ul>
    
    <script>
        var item1 = document.getElementById("item1");
        alert(item1.nextSibling.id);
    </script>
    

    3.以下用来判断浏览器的类型

    <ul>
        <li id="item1"></li>
        <li id="item2"></li>
        <li id="item3"></li>
    </ul>
    
    <script>
        var item1 = document.getElementById("item1");
        var nextNode = item1.nextSibling;
    //    Firefox 支持 document.all 这里用以判别浏览器的类型
        if(!document.all){
            while(true){
                if(nextNode.nodeType == 1){
                    break
                }else {
                    if(nextNode.nextSibling){
                        nextNode = nextNode.nextSibling;
                    }else{
                        break;
                    }
                }
            }
        }
        alert(nextNode.id);
    </script>
    

    base层封装函数

    var GLOBAL = {};
    
    GLOBAL.namespace=function(str){
    
        var arr=str.split("."),o=GLOBAL;
    
        for(i=(arr[0]=="GLOBAL")? 1:0; i<arr.length; i++){
    
            o[arr[i]]= o[arr[i]] || {};
    
            o=o[arr[i]];
    
        }
    
    };
    

    兼容 / 阻止冒泡事件

    //IE 和 Firefox 兼容
    GLOBAL.Event.getEventTarget = function (e) {
        e = window.event || e;
        return e.srcElement || e.target;
    };
    
    //阻止冒泡事件
    GLOBAL.Event.stopPropagation = function (e) {
        e = window.event || e;
        if(document.all){
            e.cancelBubble = true;
        }else{
            e.stopPropagation();
        }
    };
    

    透明度

    //设置透明度(id,透明度)
    GLOBAL.Dom.setOpacity = function (nodeElement,level){
        if (document.all){
            nodeElement.style.filter = 'alpha(opacity='+ level +')';
        }else{
            nodeElement.style.opacity = level / 100 ;
        }
    };
    
    
    //  调用
        GLOBAL.Dom.get("test1");
        GLOBAL.Dom.setOpacity(test1,30);
        GLOBAL.Dom.get("test2");
        GLOBAL.Dom.setOpacity(test2,50);
    

    监听click事件

    <style>
            #box {
                width: 100px;
                height: 100px;
                background-color: red;
            }
    
        </style>
    
    
    <div id="box">
        <input type="button" value="提交" id="btn"/>
    </div>
    
    
    <script>
        var btn = document.getElementById("btn");
        if(document.all){
            btn.attachEvent("onclick",function(){
                alert(1);
            });
        } else{
            btn.addEventListener("click",function(){
                alert(1);
            },false);
        }
        if(document.all){
            btn.attachEvent("onclick",function(){
                alert(2);
            });
        } else {
            btn.addEventListener("click", function () {
                alert(2)
            }, false);
        }
    </script>
    
    监听封装函数
    //监听click事件
    GLOBAL.Event.on = function (nodeElement,eventType,handler){
        if(document.all){
            nodeElement.attachEvent("on" + eventType,handler);
        }else{
            nodeElement.addEventListener(eventType,handler,false);
        }
    };
    

    Tab组件的扩展

    <div class="tab">
        <ul class="tab-menu" id="tab-menu">
            <li>menu1</li>
            <li>menu2</li>
            <li>menu3</li>
            <li>menu4</li>
        </ul>
        <div class="tab-content" id="tab-content">
            <div>content1</div>
            <div style="display: none">content2</div>
            <div style="display: none">content3</div>
            <div style="display: none">content4</div>
        </div>
    </div>
    
    <script>
        var tabMenu = document.getElementById("tab-menu").getElementsByTagName("li"),
                tabContent = document.getElementById("tab-content").getElementsByTagName("div");
    
    //    两种解决for循环的Bug
    //    1.利用命名空间闭包
        for(var i=0;i<tabMenu.length;i++){
            (function(_i){
                tabMenu[_i].onclick = function(){
        //            遍历数组,隐藏所有 tabContent
                    for(var j=0;j<tabContent.length;j++){
                        tabContent[j].style.display = "none";
                    }
                    tabContent[_i].style.display = "block";
                }
            })(i);
        }
    
    //     2.给DOM节点添加 _index 属性,属性等于索引
    //    for(var i=0;i<tabMenu.length;i++){
    //            tabMenu[i]._index=i;
    //            tabMenu[i].onclick = function(){
    //                //            遍历数组,隐藏所有 tabContent
    //                for(var j=0;j<tabContent.length;j++){
    //                    tabContent[j].style.display = "none";
    //                }
    //                tabContent[this._index].style.display = "block";
    //            }
    //    }
    
    </script>
    

    相关文章

      网友评论

          本文标题:JS:day09

          本文链接:https://www.haomeiwen.com/subject/idhlrxtx.html