Android 程序员搞 web 之 webApi (十 三)

Android 程序员搞 web 之 webApi (十 二)

一、节点

1、概念

文档:document;
元素:页面内所有的标签,元素----element;
节点:页面中所有的内容(标签、属性、文本),Node。

通过节点获取页面内的所有标签都十分方便;

2、节点属性

可以使用标签—元素进行直接调用,也可以使用属性节点直接调用,还可以使用文本节点直接调用。
分别为 :
nodeType (节点类型) 标签 、属性、文本 ,
nodeName (节点名字)大写标签名、小写标签属性、#text,
nodeValues (节点值)null、属性值、文本内容

3、通过子级节点获取父级节点和父级元素

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span 标签</span>
    <ul id="uu">
        <li>这是 li 1</li>
        <li>这是 li 2</li>
        <li>这是 li 3</li>
        <li>这是 li 4</li>
        <li>这是 li 5</li>
        <li>这是 li 6</li>
    </ul>
</div>

<script src="JsDemoOne.js"></script>
<script>
    var ulObj = getView$("uu");
    // 获取父级节点
    console.log(ulObj.parentNode);
    // 获取父级元素
    console.log(ulObj.parentElement);
</script>
</body>

获取父级节点和元素

4、获取父级标签的属性、标签名字、标签值

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span 标签</span>
    <ul id="uu">
        <li>这是 li 1</li>
        <li>这是 li 2</li>
        <li>这是 li 3</li>
        <li>这是 li 4</li>
        <li>这是 li 5</li>
        <li>这是 li 6</li>
    </ul>
</div>

<script src="JsDemoOne.js"></script>
<script>
    var ulObj = getView$("uu");
    // 获取父级节点
    console.log(ulObj.parentNode.nodeType);
    console.log(ulObj.parentNode.nodeName);
    console.log(ulObj.parentNode.nodeValue);
</script>
</body>

效果

5、通过父级节点获取子级节点

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span 标签</span>
    <ul id="uu">
        <li>这是 li 1</li>
        <li>这是 li 2</li>
        <li>这是 li 3</li>
        <li>这是 li 4</li>
        <li>这是 li 5</li>
        <li>这是 li 6</li>
    </ul>
</div>

<script src="JsDemoOne.js"></script>
<script>
    var ulObj = getView$("uu");
    // 获取子级节点
    console.log(ulObj.childNodes);
    //获取子级元素
    console.log(ulObj.childElementCount);
</script>
</body>

效果

6、通过 id 获取属性的节点

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span 标签</span>
    <ul id="uu">
        <li>这是 li 1</li>
        <li>这是 li 2</li>
        <li>这是 li 3</li>
        <li>这是 li 4</li>
        <li>这是 li 5</li>
        <li>这是 li 6</li>
    </ul>
</div>

<script src="JsDemoOne.js"></script>
<script>
    var ulObj = getView$("uu");
    // 获取子级节点
    var node = ulObj.getAttributeNode("id");
    console.log(node);
    //获取节点的相关数据
    console.log(node.nodeType + " ----- " + node.nodeName + " ----- " + node.nodeValue)
</script>
</body>

效果

7、关于节点和元素的其他问题

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span 标签</span>
    <ul id="uu">
        <li>这是 li 1</li>
        孙悟空
        <li>这是 li 2</li>
        貂蝉
        <li>这是 li 3</li>
        吕布
        <li id="ll">这是 li 4</li>
        西施
        <li>这是 li 5</li>
        赵云
        <li>这是 li 6</li>
        安其拉
    </ul>
</div>

<script src="JsDemoOne.js"></script>
<script>
    var ulObj = getView$("uu");
    //父级元素
    console.log((ulObj.parentElement));
    //父级节点
    console.log((ulObj.parentNode));
    //子级元素
    console.log((ulObj.children));
    //子级节点
    console.log((ulObj.childNodes));
    // 第一个子级节点
    console.log((ulObj.firstChild));
    //第一个子级元素
    console.log((ulObj.firstElementChild));
    // 最后一个子级节点
    console.log((ulObj.lastChild));
    //最后一个子级元素
    console.log((ulObj.lastElementChild));
    //上一个兄弟节点
    console.log(getView$("ll").previousSibling);
    //上一个兄弟元素
    console.log(getView$("ll").previousElementSibling);
    //下一个兄弟节点
    console.log(getView$("ll").nextSibling);
    //下一个兄弟元素
    console.log(getView$("ll").nextElementSibling);
</script>
</body>

效果

8、通过节点方式变换标签样式

<body>
<div id="dv">
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <span>这是一个 span </span>
    <p>这是一个 p 标签</p>
    <a>这是一个 a 标签</a>
    <a>这是一个 a 标签</a>
    <span>这是一个 span </span>
    <p>这是一个 p 标签</p>

</div>

<script src="JsDemoOne.js"></script>
<script>
    var dvObj = getView$("dv");

    var nodes = dvObj.childNodes;
    for (var i = 0; i < nodes.length; i++) {

        if (nodes[i].nodeType === 1 && nodes[i].nodeName === "P") {
            nodes[i].style.backgroundColor = "blue";
        }
    }
</script>
</body>

效果

9、设置背景图片的方法

document.body.style.backgroundImage=“url(”+this.src+")";

二、元素相关

1、js 代码创建元素方式

1)、document .write(“标签的代码及内容”);
2)、对象.innerHTML=“标签及代码”;
3)、document.createElement(“标签的名字”);

第一种方式创建标签存在缺陷,如果在页面加载完毕创建标签会将之前的标签覆盖;
第二种方式创建标签,每次创建都会初始化一个标签,导致多个标签覆盖;
第三种方式创建标签,是不断追加的效果;

2、在 div 内动态添加列表

<body>
<input value="创建标签" type="button" id="btn">
<div id="dv">
</div>

<script src="JsDemoOne.js"></script>
<script>

    var names = ["孙悟空", "貂蝉", "赵云", "奕星", "凯", "花木兰"];
    
    getView$("btn").onclick = function () {

        var ulObj = document.createElement("ul");
        getView$("dv").appendChild(ulObj);

        for (var i = 0; i < names.length; i++) {
            var liObj = document.createElement("li");
            liObj.innerHTML = names[i];
            ulObj.appendChild(liObj);
            liObj.onmouseover = ba1;
            liObj.onmouseout = bac2;
        }
    };

    function ba1() {
        this.style.backgroundColor = "blue";
    }

    function bac2() {
        this.style.backgroundColor = "";
    }
</script>
</body>

效果

直等于 调用函数,函数不应该带有括号。

三、事件

1、绑定事件的区别

1)、addEventListener()
<body>
<input value="创建标签" type="button" id="btn">
<div id="dv">
</div>

<script src="JsDemoOne.js"></script>
<script>
    getView$("btn").addEventListener("click", function () {

    }, false);
</script>
</body>

该点击事件 ie8 不支持,其他的浏览器版本都支持;

2)、attachEvent()
<body>
<input value="创建标签" type="button" id="btn">
<div id="dv">
</div>

<script src="JsDemoOne.js"></script>
<script>
    getView$("btn").attachEvent("onclick", function () {
        console.log("123")
    });
</script>
</body>

该点击事件仅 ie8 — ie 10 使用;
attachEvent 中的 this 指的是 window 对象;

2、解绑事件

1)、对象 . οnclick=null ;
2)、addEventListener 方式 解绑事件

<body>
<input value="创建标签" type="button" id="btn1">
<input value="解除事件" type="button" id="btn2">
<div id="dv">
</div>

<script src="JsDemoOne.js"></script>
<script>
    getView$("btn1").addEventListener("click", f1, false);
    getView$("btn1").addEventListener("click", f2, false);

    function f1() {
        console.log("事件一");
    }

    function f2() {
        console.log("事件二");
    }

    getView$("btn2").onclick = function () {
        getView$("btn1").removeEventListener("click", f1, false);
    }
</script>
</body>

这种方式解绑事件 必须是命名函数;
3)、attachEvent 方法解除绑定事件

<body>
<input value="创建标签" type="button" id="btn1">
<input value="解除事件" type="button" id="btn2">
<div id="dv">
</div>

<script src="JsDemoOne.js"></script>
<script>
    getView$("btn1").attachEvent("onclick", f1, false);
    getView$("btn1").attachEvent("onclick", f2, false);

    function f1() {
        console.log("事件一");
    }

    function f2() {
        console.log("事件二");
    }

    getView$("btn2").onclick = function () {
        getView$("btn1").detachEvent("onclick", f1, false);
    }
</script>
</body>

3、事件冒泡

定义:多层嵌套的元素,有层次关系,这些元素注册了相同的事件,如果里面元素的事件出发了,外面的元素该事件也被触发。换句话说就是冲突了,突然想感谢 google 爸爸的事件分发机制。

解决事件冒泡问题:

1)、ie 和 谷歌都支持的方法

window.event.cancelBubble = true;

2)、火狐 和 谷歌都支持的方法

event.stopPropagation();

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div1 {
            width: 400px;
            height: 400px;
            background-color: blue;
        }

        .div2 {
            width: 300px;
            height: 300px;
            background-color: blueviolet;
        }

        .div3 {
            width: 200px;
            height: 200px;
            background-color: coral;
        }
    </style>

</head>
<body>
<div id="dv1" class="div1">
    <div id="dv2" class="div2">
        <div id="dv3" class="div3">
        </div>
    </div>
</div>

<script src="JsDemoOne.js"></script>
<script>

    getView$("dv1").onclick = function () {
        console.log("1111111");
    };
    getView$("dv2").onclick = function () {

        console.log("22222222");
    };
    /**
     * 
     * @param event 事件处理参数对象
     */
    getView$("dv3").onclick = function (event) {
        // window.event.cancelBubble = true;
        event.stopPropagation();
        console.log("333333333");
    };

</script>
</body>

4、事件的阶段

1)、事件捕获阶段

从外向内

2)、事件目标阶段

最开始选择的那个

3)、

事件冒泡阶段
从里想外

5、一个元素注册多个事件

<body>
<input type="button" id="btn" value="测试多个事件">

<script src="JsDemoOne.js"></script>
<script>

    getView$("btn").onclick = f1;
    getView$("btn").onmouseover = f1;
    getView$("btn").onmouseout = f1;

    function f1(event) {
        switch (event.type) {
            case "click":
                alert("点击了");
                break;
            case "mouseover":
                this.style.background = "green";
                break;
            case "mouseout":
                this.style.background = "red";
                break
        }
    }
</script>
</body>

欢迎关注

猜你喜欢

转载自blog.csdn.net/xiangshiweiyu_hd/article/details/103262465