获取dom对象(4)

<html>
<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <title>获取dom对象</title>
</head>
<body>
    <input id="btn1" class="btn1" type="button" value="mybtn1" />
    <input name="btn1" class="btn1" type="button" value="mybtn2" />
    <img src="" alt="img1" />
    <img src="" alt="img2" />
    <div id="mydiv">
        <input class="btn2" type="button" data="test" value="mybtn3" />
        <input class="btn2" type="button" value="mybtn4" />
    </div>
</body>
</html>

<script type="text/javascript">
    //兼容ie浏览器测试
    var console = console || {};
    console.log = console.log || function(a){
        alert(a);
    }

    /*
    在实际开发中,可能更多的时候我们会使用jquery框架.
    而且使用框架获取dom对象,相当的简单和方便.
    这是由于这些框架封装了获取dom的方法,并且封装的看不太懂.
    那我们就来尝试着自己封一下.
    */

    /*
    先来一个最简单的,简单封装一下getElementById
    */

    //封装getElementById
    function $(id){
        var dom = null;
        if(id != null && id != ""){
            dom = document.getElementById(id);
        }
        return dom;
    }

    /*
    //通过$方法获取dom
    var btn1 = $("btn1");
    //输出btn1的value
    console.log(btn1.value);//mybtn1
    */

    /*
    这种方式就看起来比较眼熟了.
    但是怎么获取class相同的dom呢.
    我们好像很习惯直接使用class去获取dom,我想这可能是分工的原因.
    经常我们开发的时候,已经有美工MM,帮我们做好了静态页面,然后页面中有很多已经很好的class供我们选择.
    其实我是比较反对任何时候都直接使用class去获取dom,不管你用什么框架.
    因为我们知道通过id获取dom是效率最高.
    既然如此,为什么还要提供这样的方法,我只能说懒是人的共性.
    */

    /*
    那怎么做呢?
    第一步,通过getElementsByTagName(),获取到整个文档的所有元素.
    第二步,判断这些元素的className是否是我们需要的.
    */

    function $(classname){
        var dom = [];
        if(classname != null && classname != ""){
            //获取全部元素
            var all = document.getElementsByTagName("*");
            for(var i = 0,len = all.length; i < len; i++) {
                var obj = all[i];
                if(obj.className === classname){
                    //保存匹配的dom
                    dom.push(obj);
                }
            }
        }
        return dom;
    }

    /*
    //获取class=btn1的元素
    var btns = $("btn1");
    for(var i = 0,len = btns.length; i < len; i++){
        console.log(btns[i].value);//mybtn1,mybtn2
    }
    */

    /*
    我们得到class相同的元素,但是这样的调用方式并不是我们所习惯的.
    那我们仿造jquery的样子,稍微修改一下.
    jquery中id使用#开头,class使用.开头
    */

    /*
    思路:
    第一步,获取字符串的第一个字符.
    第二步,判断第一个字符的类别,做不同的处理.
    */
    function $(str){
        var dom = null;
        if(str != null && str != ""){
            //获取标识,得到字符串的第一个字符
            var c = str.charAt(0);
            switch(c){
                case "#":
                    //截取ID,从第一个字符开发到最后
                    var id = str.substring(1);
                    dom = document.getElementById(id);
                break;
                case ".":
                    dom = [];
                    //截取
                    var classname = str.substring(1);
                    if(classname != null && classname != ""){
                        //获取全部元素
                        var all = document.getElementsByTagName("*");
                        for(var i = 0,len = all.length; i < len; i++) {
                            var obj = all[i];
                            if(obj.className === classname){
                                //保存匹配的dom
                                dom.push(obj);
                            }
                        }
                    }
                break;
                default:
                    //如果第一个字符不是我们想要的,做一个容错处理
                    dom = document.getElementById(str);
                break;
            }
        }
        return dom;
    }

    var btn1 = $("#btn1");
    console.log(btn1.value);//mybtn1

    var btns = $(".btn1");
    for(var i = 0,len = btns.length; i < len; i++){
        console.log(btns[i].value);//mybtn1,mybtn2
    }

    /*
    这样看起来就有那么点像jquery的感觉了,这仅仅是看起来像而已.
    因为jquery的选择器比这要复杂的多的多的多.
    这都不要紧,我们不是想造一个jquery,我们只是在按自己的思路封装代码,好让我们的工作变得简单.
    */

    /*
    实际开发过程中,需求总是多变而且复杂的,所以这样简单的封装并不能让我们的工作变的简单.
    那怎么办呢?
    简单分析一下,获取dom元素,有用的标识无非三种(id,tag,attr),其实name也是一种属性值.
    那么,根据优先级我们组合一下各种情况.
    id
    id + tag
    id + tag + attr
    tag
    tag + attr
    attr(只有当是name的时候有效,不然就应该是 * + attr)
    */

    /*
    思路:
    第一步,申明一个函数接收三个参数id,tag,attr.
    第二步,根据不同的组合编写逻辑.
    */

    /*
    id:string
    tag:string
    attr:属性值都是key=value,所以第三个参数应该对象
    */
    function getDom(id,tag,attr){
        var dom = null;
        //获取传入参数的个数
        var len = arguments.length;
        switch(len){
            case 1:
                //如果只传了一个参数,那么符合只根据 id 查找
                //我们直接通过getElementById()获取dom
                dom = document.getElementById(arguments[0]);
            break;
            case 2:
                //如果传了两个参数,那么符合 id + tag
                //我们知道js是支持获取全部文档指定tag的元素,
                //所以当id传入空串的时候,就能满足这种情况.(但是这种效率是低下的,可以根据实际情况是否需要必须指定id)

                //ok,先判断id是否有值
                var id = arguments[0] || "";
                var tag = arguments[1] || "";
                if(id !== "" && tag !== ""){
                    dom = document.getElementById(id).getElementsByTagName(tag);
                }
                else{
                    if(tag !== ""){
                        dom = document.getElementsByTagName(tag);
                    }
                    else{
                        //都传入空值不合法
                    }
                }
            case 3:
                //如果三个参数都有,就比较复杂了,我们列举一下.
                // id + tag + attr
                // "" + tag + attr
                // "" + "" + attr(只能是name)
                // id + "" + attr(这种是不成立的,因为id唯一)
                //但是数学的排列组合不是这样的,还有 "" + tag + ""
                //我们细想一下,这样就应该只传入两个参数呀

                var id = arguments[0] || "";
                var tag = arguments[1] || "";
                //属性值都是key=value,所以第三个参数应该对象
                var attr = arguments[2] || {};
                if(id !== ""){
                    if(tag !== "" && attr !== ""){
                        // id + tag + attr
                        dom = [];
                        //属性
                        var key = null;
                        //属性值
                        var aval = null;
                        //解析attr
                        for(var k in attr){
                            key = k;
                            aval = attr[k];
                        }
                        //获取某个id下的全部tag元素
                        var all = document.getElementById(id).getElementsByTagName(tag);
                        for(var i = 0,len = all.length; i < len; i++) {
                            var obj = all[i];
                            if(obj.getAttribute(key) === aval){
                                //保存匹配的dom
                                dom.push(obj);
                            }
                        }
                    }
                    else{
                        //不应该成立情况
                        // id + tag + "" (应该只传入两个参数)
                        // id + "" + attr(这种是不成立的,因为id唯一)
                    }
                }
                else{
                    if(tag !== ""){
                        // "" + tag + attr
                        dom = [];
                        //属性
                        var key = null;
                        //属性值
                        var aval = null;
                        //解析attr
                        for(var k in attr){
                            key = k;
                            aval = attr[k];
                        }
                        //获取全部tag元素
                        var all = document.getElementsByTagName(tag);
                        for(var i = 0,len = all.length; i < len; i++) {
                            var obj = all[i];
                            if(obj.getAttribute(key) === aval){
                                //保存匹配的dom
                                dom.push(obj);
                            }
                        }
                    }
                    else{
                        // "" + "" + attr(只能是name)
                        //js只提供了getElementByName的接口,所以不能直接获取其它属性值的dom
                        //如果要获取其它属性值的dom,只能采用 tag + attr

                        dom = [];
                        //属性
                        var key = null;
                        //属性值
                        var aval = null;
                        //解析attr
                        for(var k in attr){
                            key = k;
                            aval = attr[k];
                        }
                        if(key === "name"){
                            dom = document.getElementsByName(aval);
                        }
                        else{
                            //参数不合法
                        }
                    }
                }
            break;
        }
        return dom;
    }

    /*
    到这里,我们基本就完成了关于获取dom的封装,我们测试一下各种情况
    */

    //id
    var dom = getDom("btn1");
    console.log(dom.value);//mybtn1

    //id + tag
    var dom = getDom("mydiv","input");
    for(var i in dom){
        console.log(dom[i].value);//mybtn3,mybtn4
    }
    // "" + tag
    var dom = getDom("","input");
    for(var i in dom){
        console.log(dom[i].value);//mybtn1,mybtn2,mybtn3,mybtn4
    }

    //id + tag + attr
    var dom = getDom("mydiv","input",{"data":"test"});
    for(var i in dom){
        console.log(dom[i].value);//mybtn3
    }

    // "" + tag + attr
    var dom = getDom("","input",{"class":"btn1"});
    for(var i in dom){
        console.log(dom[i].value);//mybtn1,mybtn2
    }

    // "" + "" + attr(只能是name)
    var dom = getDom("","",{"name":"btn1"});
    for(var i = 0,len = dom.length; i < len; i++){
        console.log(dom[i].value);//mybtn2
    }

    /*
    好了,有点小意思了对吧,这样就应该可以满足需要了.
    但是,回头我看一下封装好的getDom,在处理第三种情况的时候有一些代码冗余了.
    我们可以不可优化一些呢.
    思考一下:
    可以把冗余的代码写成一个函数.
    */

    /*
    id:string
    tag:string
    attr:属性值都是key=value,所以第三个参数应该对象
    */
    function getDom(id,tag,attr){

        //封装第三种情况,根据tag,attr获取dom
        function getbytag(id,tag,attr){
            var dom = [];
            //属性
            var key = null;
            //属性值
            var aval = null;
            //解析attr
            for(var k in attr){
                key = k;
                aval = attr[k];
            }

            var all = null;
            if(id !== ""){
                //获取某个id下的全部tag元素
                all = document.getElementById(id).getElementsByTagName(tag);
            }
            else{
                all = document.getElementsByTagName(tag);
            }

            for(var i = 0,len = all.length; i < len; i++) {
                var obj = all[i];
                if(obj.getAttribute(key) === aval){
                    //保存匹配的dom
                    dom.push(obj);
                }
            }
            return dom;
        }

        var dom = null;
        //获取传入参数的个数
        var len = arguments.length;
        switch(len){
            case 1:
                //如果只传了一个参数,那么符合只根据 id 查找
                //我们直接通过getElementById()获取dom
                dom = document.getElementById(arguments[0]);
            break;
            case 2:
                //如果传了两个参数,那么符合 id + tag
                //我们知道js是支持获取全部文档指定tag的元素,
                //所以当id传入空串的时候,就能满足这种情况.(但是这种效率是低下的,可以根据实际情况是否需要必须指定id)

                //ok,先判断id是否有值
                var id = arguments[0] || "";
                var tag = arguments[1] || "";
                if(id !== "" && tag !== ""){
                    dom = document.getElementById(id).getElementsByTagName(tag);
                }
                else{
                    if(tag !== ""){
                        dom = document.getElementsByTagName(tag);
                    }
                    else{
                        //都传入空值不合法
                    }
                }
            case 3:
                //如果三个参数都有,就比较复杂了,我们列举一下.
                // id + tag + attr
                // "" + tag + attr
                // "" + "" + attr(只能是name)
                // id + "" + attr(这种是不成立的,因为id唯一)
                //但是数学的排列组合不是这样的,还有 "" + tag + ""
                //我们细想一下,这样就应该只传入两个参数呀

                var id = arguments[0] || "";
                var tag = arguments[1] || "";
                //属性值都是key=value,所以第三个参数应该对象
                var attr = arguments[2] || {};
                if(id !== ""){
                    if(tag !== "" && attr !== ""){
                        // id + tag + attr
                        dom = [];
                        //获取dom元素
                        dom = getbytag(id,tag,attr);
                    }
                    else{
                        //不应该成立情况
                        // id + tag + "" (应该只传入两个参数)
                        // id + "" + attr(这种是不成立的,因为id唯一)
                    }
                }
                else{
                    if(tag !== ""){
                        // "" + tag + attr
                        dom = [];
                        //获取dom元素
                        dom = getbytag(id,tag,attr);
                    }
                    else{
                        // "" + "" + attr(只能是name)
                        //js只提供了getElementByName的接口,所以不能直接获取其它属性值的dom
                        //如果要获取其它属性值的dom,只能采用 tag + attr

                        dom = [];
                        //属性
                        var key = null;
                        //属性值
                        var aval = null;
                        //解析attr
                        for(var k in attr){
                            key = k;
                            aval = attr[k];
                        }
                        if(key === "name"){
                            dom = document.getElementsByName(aval);
                        }
                        else{
                            //参数不合法
                        }
                    }
                }
            break;
        }
        return dom;
    }

    //id
    var dom = getDom("btn1");
    console.log(dom.value);//mybtn1

    //id + tag
    var dom = getDom("mydiv","input");
    for(var i in dom){
        console.log(dom[i].value);//mybtn3,mybtn4
    }
    // "" + tag
    var dom = getDom("","input");
    for(var i in dom){
        console.log(dom[i].value);//mybtn1,mybtn2,mybtn3,mybtn4
    }

    //id + tag + attr
    var dom = getDom("mydiv","input",{"data":"test"});
    for(var i in dom){
        console.log(dom[i].value);//mybtn3
    }

    // "" + tag + attr
    var dom = getDom("","input",{"class":"btn1"});
    for(var i in dom){
        console.log(dom[i].value);//mybtn1,mybtn2
    }

    // "" + "" + attr(只能是name)
    var dom = getDom("","",{"name":"btn1"});
    for(var i = 0,len = dom.length; i < len; i++){
        console.log(dom[i].value);//mybtn2
    }

    /*
    知识点:
    getAttribute,这个是获取dom对象的属性方法.对应的设置一个属性就是setAttribute.
    arguments,这是个很神奇的东西,它是js里面一个特殊的对象,有length属性,但它却不是数组.
    它是函数接收参数的副本,调用函数的时候传入了多少个参数,length就是几,跟函数接收几个参数无关哦.
    细细回味一下,动态参数个数,这泥马不是面向对象中的多态嘛.呵呵.你说是就是吧.
    */
</script>

获取dom对象(4)

时间: 2024-10-14 04:20:35

获取dom对象(4)的相关文章

获取dom对象(2)

<html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>获取dom对象</title> </head> <body> <input name="btn1" type="button" value="myb

获取dom对象(1)

<html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>获取dom对象</title> <style> #btn3{ border:1px solid red; } #btn33{ border:1px solid blue; } </style> </

获取dom对象(3)

<html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>获取dom对象</title> </head> <body> <input class="btn1" type="button" value="my

extjs 获取Dom对象

对象指页面上的某一部分,如:Input等.我觉得在EXT JS中会有三类基本对象,htmlelement , EXT.Element和CompositeElement .分别解释一下: htmlelement指html页面的各种标记元素,可以用document.getElementById()获得,具有html对象的方法和属性. EXT.Element是最重要的EXT对象,在dom对象的基础上,又包装了很多方法和属性,可以用EXT.get()获取. CompositeElement 是一组EXT

做一个类似JQuery获取DOM对象的$()

在dom操作时,有时根据id获取单个对象.有时根据className获取多个对象.平常可能我们用两个函数来实现这两个功能.不过我将它们整合了一下,目前使用情况良好,函数如下: view source print? 01 // 根据selector获取单个或多个元素, 02 // 获取多个元素时,可以指定元素的tag类型和父元素 03 function $(selector, tag, parent) { 04     var ret = []; 05     06     //没有传递selec

js获取dom对象style样式的值

js获取到的dom对象的style通常是没有值得,因为我们都写在外部文件中,从慕课网上见到讲师封装的一个方法,挺不错.特此记录下来. 1 function getStyle(obj,attr){ 2 if(obj.currentStyle){//兼容IE 3 return obj.currentStyle[attr]; 4 }else{ 5 return getComputedStyle(obj,false)[attr]; 6 } 7 }

JavaScript获取DOM对象的几种方式

1.getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用 2.getElementsByName() 方法可返回带有指定名称的对象的集合 3.getElementsByTagName() 方法可返回带有指定标签名的对象的集合 4.getElementsByClassName() 方法可返回带有指定类名的对象的集合 5.querySelector() 方法可返回匹配指定 CSS 选择器的一个对象的引用 6.querySelectorAll() 方法可返回匹配指定 CSS

js操作DOM对象及怎么获取浏览器宽高

DOM独立于具体的编程语言,通常通过JavaScript访问DOM,不过并不严格要求这样.可以使用任何脚本语言来访问DOM,这要归功于其一致的API.getElementById(id) (document) 获取有指定惟一ID属性值文档中的元素getElementsByTagName_r(name) 返回当前元素中有指定标记名的子元素的数组hasChildNodes() 返回一个布尔值,指示元素是否有子元素getAttribute(name) 返回元素的属性值,属性由name指定有了W3C D

JavaScript之DOM对象的获取

之前我们讲过JavaScript之DOM对象获取的两篇文章,本文是该系列文章之三,点击回顾上两篇文章能更好地理解本文.<JavaScript之DOM对象的获取(一)>: <JavaScript之DOM对象的获取(二)> 接下来,开始讲述本文内容.在文档中,我们还可以通过不同的现象和特征获取DOM对象. 8.document.activeElement 这是一个属性,返回当前获取焦点的元素  效果 9.document.anchors 返回对文档中所有Anchor对象的引用,即获取当