渡一 18&19 选择器,节点类型&Dom基本操作

节点有:
元素节点 1
属性节点 2
文本节点 3
注释节点 8
document 9
DocumentFragment 11

 

节点的四个属性
nodeName:标签名,只读
nodeValue:节点的文本内容,可写
nodeType:节点类型,只读
attributes:Element节点的属性集合

 

找节点:(包含文本,属性等在内)
parentNode:父亲节点(最顶端的是documents)
childNodes:子节点们
firstChild:第一个节点
lastChild:最后一个节点
nextSibling:下一个兄弟节点
previousSibling:前一个兄弟节点

 

找元素节点(有很多兼容问题)

parentElement:返回父元素节点
children:只返回当前元素的元素节点,不找孙子
node.chilElementCount == node.children.length 当前元素节点的子元素个数(IE NO)
firstElementChild:第一个元素节点(IE NO)
lastElementChild:最后一个元素节点(IE NO)
nextElementSibling/previousElementSibling:后一个、前一个兄弟元素节点(IE NO)

复制代码
function retElementChild(node){

    var temp = {
        length : 0,
        push : Array.prototype.push,
        splice : Array.prototype.splice
    },
    child = node.childNodes,
    len = child.length;

    for(var i=0;i<len;i++){
        if(child[i].nodeType === 1){
            temp.push(child[i]);
        }
    }
    return temp;
}
复制代码

课堂练习
1.遍历元素节点树(在原型链上编程)
2.封装函数,返回元素e在第n层祖先元素节点
3.封装函数,返回元素e的第n个兄弟元素节点,n为正,返回后面的兄弟元素节点,n为负数,返回前面的,n为0,返回自已
4.编辑函数,封装myChild功能,解决以前部分浏览器的兼容性问题
5.自己封装hasChildren()方法,不可用childen属性

2.

复制代码
function retParent(elem,n){

    while(n){
        elem = elem.parentElement;
        n--;
    }
    return elem;

}
复制代码

3.

复制代码
function retSibling(e,n){

    while(e && n){
        if(n>0){
            e = e.nextElementSibline;
            n--;
        }else{
            e = e.previousElementSibling;
            n++;
        }
    }
    return e;
}
复制代码

兼容

复制代码
function retSibline(e,n){

    while(e && n){
        if(n>0){
            if(e.nextElementSibline){
                e = e.nextElementSibline;
            }else{
                for(e=e.nextSibling; e.nodeType!= 1; e=e.nextSibline);
            }
            n--;
        }else{
            if(e.previousElementSibling){
                e = e.previousElementSibling;
            }else{
                for(e=e.previousSibling; e.nodeType!=1; e=e.previousSibling)
            }
            n++;
        }
    }
    return e;
}
复制代码

 

4.

复制代码
Element.prototype.myChild = function(){

    var child = this.childNodes;
    var len = child.length;
    var arr = [];
    for(var i = 0;i<len;i++){
        if(child[i].nodeType == 1){
            arr.push(child[i]);
        }
    }
    return arr;
}
复制代码

Dom基本操作

兼容是指IE9及以下的问题

层级关系

document-->HTMLDocument.prototype-->Document.prototoype-->Object.prototype

HTMLElment.prototype.abc = "demo";
var body = document.getElementsByTagName("body")[0];

 

复制代码
增
document.createElement();
document.createTexNode();
document.createComment();
document.createDocumentFragment();

插
parentNode.appendChild();   //是剪切操作
parentNode.insetBefor(a,b); //insert a before b:在b前面插入a 

删
parent.removeChild(); //被杀
child.remove();       //自杀
复制代码

 

element节点的一些属性

innerHTML();
innerText();
element.innerHTML //插入
element.innerHTML = "123";
element.innerHTML += "456";

 

element节点的一些方法

ele.setAttibute();
ele.getAttribute();
var aa = document.getElementsByTagName(*);
for(var i=0;i<all.length;i++){
    all[i].setAttibute("this-name".all[i].nodeName);
}

课堂练习

请编写一段js脚本生成下面这段Dom结构。要求使用标准的DOM方法或属性

复制代码
<div class="example">
    <p class="slogan">test</p>
</div>

//揭示 dom.className可以读写class;

var div = document.createElement("div");
var p = document.createElment("p");
var text = document.createTexNode('test');
div.setAttibute("class","example");
p.setAttribute("class","slogan");

p.appendChild(text);
div.appendChild(p)
document.body.appendChild(div)
复制代码

课后作业
1.封装函数insertAfter();功能类似insertBefor();
提示:可忽略老版本浏览器,直接在Element.prototype上编写
2.将目标节点内部的节点顺序逆序;
eg:<div><a></a><em></em></div>
<div><em></em><a></a></div>

1.

复制代码
Element.prototype.insertAfter = function(target,afterNode){
    var beforeNode = afterNode.nextElementSibline;
    if(beforeNode != null){
        this.appendChild(target);
    }else{
        this.insetBefore(target,beforeNode);
    }

}
复制代码

 

posted @   lisa2544  阅读(68)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示