JS操作DOM

JS 里核心内容之一应该就是操作DOM了吧,先了解一下什么是DOM,DOM的全称是 Document  Object Model,由此可知,DOM由  document和object两部分组成

document不是普通的文档 而是 html 和xml这2种类型的文档,因为他们都有一个共同的特点   标记语言

object 这个更简单了,js不可能直接操作标记的元素,所以必须要把这些元素转换成js对象,然后才可以用js操作

因此js就把document和object联系起来,操作DOM了。

 Js操作DOM文档,主要是操作3个方面:

1、操作元素的属性

2、操作元素的内容  

innerText 只有文本没有其他标签,但是它不兼容,在火狐里的话得用textContent

innerHTML 这个是通用的,没有兼容性问题

 <a id="t" href="http://abc.com" title="test">test</a>
    <script>
        var obj = document.getElementById("t");
        alert(obj.href);
        obj.title = "asd"
        alert(obj.title);

        alert(obj.innerText);
        obj.innerHTML = "<b>Test</b>";
        alert(obj.innerText);
        alert(obj.innerHTML);

        alert(obj.outerHTML);  //<a id="t" href="http://abc.com" title="test">test</a>
        alert(obj.outerText);  //test
    </script>

我发现,每次设置值,然后在获取值,要不要写个方法封装一下呢

<a id="t" href="http://abc.com" title="test">test</a>
    <script>
        var obj = document.getElementById("t");
        
        alert(NameValue(obj));
        NameValue(obj, "<b>qqqqqqqqqqq</b>");
        alert(NameValue(obj));
        function NameValue(obj,value)
        {
            if (typeof (value) == "undefined") {
                return obj.innerText;
            }
            else {
                obj.innerText = value;     1
               //obj.innerHTML = value;    2
} } </script>

这样就好了,但是我发现,在设置值的时候,如果用的1方式的话,那么页面上显示的就是 <b>qqqqqqqqqqq</b>弹出框也是<b>qqqqqqqqqqq</b>,如果用的是2方式

那么页面上显示的是加粗的qqqqqqq ,弹出框里是qqqqqq,我想此时才真名明白了innerText和innerHTML的真正用法了吧。

但是对于表单元素的话,获取值的时候必须要value

 

 

还要补充一点,将DOM元素转换成js对象有2种方式:

1、

document.getElementsByTagName("div"); 数组

document.getElementById("Id"); 一个

document.getElementsByName("Name"); 数组

2、

 

最重要的:操作节点

 

 <div>
        <p>111111111111111</p>
        <div>222222222222222222222222</div>
        <ul id="u">
            <li>33333333333q</li>
            <li>33333333333w</li>
            <li>33333333333e</li>
            <li>33333333333r</li>
        </ul>
        <h2>4444444444</h2>
    </div>

    <script>
        var obj = document.getElementById("u");
        // alert(obj.nodeValue);  //null 为甚是null请看下面
        //alert(obj.nodeType);  // nodeType=1说明是节点元素
        //alert(obj.nodeName);

        for (var i = 0; i < obj.childNodes.length; i++) {
            //document.write(obj.childNodes[i].nodeName + " : " + obj.childNodes[i].nodeValue+"<br/>");
            //这就是执行的结果  为甚长度是9呢?
            //#text :
            //LI : null
            //#text :
            //LI : null
            //#text :
            //LI : null
            //#text :
            //LI : null
            //#text :

            //另外为什么要判断一下节点的类型,原因很简单,由于浏览器的兼容性问题,换行也是一个节点,所以根据节点类型先排除非元素类型的节点
            if (obj.childNodes[i].nodeType == 1) {
                //<li>33333333333q</li>获取它的节点值不能是节点.nodeValue
                //因为 33333333333q 是一个文本节点,它的父节点是 li,所以结果应该是
                //li.childNodes[0].nodeValue
                document.write(obj.childNodes[i].nodeName + " : " + obj.childNodes[i].childNodes[0].nodeValue + "<br/>");
            }

        }
        document.write(obj.previousSibling.previousSibling.nodeName + " : " + obj.previousSibling.previousSibling.childNodes[0].nodeValue + "<br/>");
        document.write(obj.nextSibling.nextSibling.nodeName + " : " + obj.nextSibling.nextSibling.childNodes[0].nodeValue);
    </script>

 接下来小谈一下  文档流   :

    aaaa<br />
    aaaa<br />
    aaaa<br />
    aaaa<br />
    <script>
        function Test() {
            document.write("bbbb<br />");
            document.write("bbbb<br />");
            document.write("bbbb<br />");
            document.write("bbbb<br />");
        }
      //  Test();   1
    </script>
    cccc<br />
    cccc<br />
    cccc<br />
    cccc<br />

    <a onclick="Test();">Add</a>  2

当使用方式1 的时候,页面上abc按顺序来,当使用方式2 的时候,页面上有a和c,点击后,就只有b了,原因很简单

因为,页面刚加载完的时候,这个当前的文档流已经完成了,此时点击执行的时候,因为用的是document.write();就是再向文档流里下东西,因为当前文档流已经关闭了,所以只能向第二个文档流里写入,所以此时没有a和c,就只有b了

插入节点

    aaaa<br />
    <div id="id" style="background:yellow;">
        <p>111</p>
        <p id="s">222</p>
    </div>
    <script>
        function Test() {
            var img = document.createElement("img");
            img.src = "http://static.cnblogs.com/images/adminlogo.gif";

            var a = document.createElement("a");
            a.href = "http://www.baidu.com";
            a.target = "_blank";
            a.title = "good" + new Date().getSeconds();
            // a.innerText = "haha"
            a.appendChild(img);

            var p = document.getElementById("id");
            //  p.appendChild(a);//将新元素放到p元素的末尾多个新元素按照先来后到的顺序排列

            var s = document.getElementById("s");
            p.insertBefore(a, s);//将新元素插入到父元素的指定的某个子元素之前,但是插入的多个新元素的顺序还是正常的先来后到行的。
        }
        //  Test();
    </script>

因为系统只提供了在父元素下指定的子元素前插入节点,并未提供在指定的元素后面插入节点,所以打算自定义一个方法:

 function insertAfter(oem,obj, em)
        {
            //因为我用的是谷歌浏览器,如果2行代码之间有换行的话要想定位到真是的兄弟元素,就得来2次nextSibling
            if (obj.nextSibling.nextSibling.nodeType == 1) {
                oem.insertBefore(em, obj.nextSibling.nextSibling);
            }
            else {
                oem.appendChild(em);
            }
        }

 删除子节点的:

        function Del()
        {
            var p = document.getElementById("id");
            p.removeChild(p.lastChild); //从下往上删除,  但要注意 换行是否占一个元素节点
p.removeChild(p.firstChild);//从上往下删除 }

 

posted on 2017-03-04 23:00  奔游浪子  阅读(104)  评论(0)    收藏  举报

导航