javascript Element类型

本文围绕JavaScript操作HTML元素展开,介绍了Element节点相关属性,如nodeName、tagName等。阐述了HTML元素类型继承关系,还讲解了取得特性、设置特性、attributes属性的操作方法,以及创建元素、处理元素子节点和获取元素尺寸与位置等内容,并给出了最佳实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. Element节点是Element类型的实例;
  2. Element节点的nodeName与tagName属性元素的标签名的大写;nodeValue为null;
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123">123</div>
        </body>
        <script>
            var _div = document.getElementById("123");
            console.log(_div.nodeName);
            console.log(_div.tagName);
            console.log(_div.nodeValue);
        </script>
    </html>

     

  3. 最佳实践:在比较标签名与字符串时,最好先将标签名转为为全小写。

HTML元素

  • 所有HTML元素都由HTMLElement类型表示,HTMLElement类型继承自Element类型并添加了一些属性和方法;

所有HTML元素都是由HTMLElement或者其子类型表示的,每个HTML元素都由与之关联的类型,如:HTMLAnchorElement, HTMLBodyElement, HTMLDivElement..., 这些类型都继承HTMLElement类型的属性和方法,也有着自己的扩展

  •  大部分HTML标签的原生特性作为Element节点对象的属性都可以直接通过"."或"[]"操作符读写,但无法读写自定义的特性(见下面的取得特性一节)
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123">123</div>
        </body>
        <script>
            var _div = document.getElementById("123");
            console.log(_div.id);
            console.log(_div.className);
            console.log(_div.name);
            console.log(_div["id"]);
            console.log(_div["className"]);
            console.log(_div["name"]);
        </script>
    </html>

     

  • class为ES的保留字,使用“.” 或"[]"访问元素类名需要使用className。

取得特性

getAttribute(), setAttribute(), removeAttribute()三个特性操作的方法:

  1. 传递给getAttribute()的特性名字符串与实际的特性名相同,比如:要获取class的特性值,应该传入'class',而不是'className';
  2. 通过getAttribute()方法可以取得自定义特性;
  3. 最佳实践:根据HTML5的规范推荐,自定义特性应该加上data-前缀以便验证;
  4. getAttribute()方法与节点的访问方法".style"返回值的类型不同,前者返回一个字符串,后者返回CSSStypleDeclaration对象;
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            var _div = document.getElementById("123");
            console.log(_div.getAttribute("style"));  // 输出:height: 20px;
            console.log(_div.style);  // 输出:CSSStyleDeclaration {0: "height", alignContent: "", …}
        </script>
    </html>

    同理,访问节点的"onclick"也分别返回function和字符串 

  5. 最佳实践:只在获取标签的自定义特性值的情况下才使用getAttribute()方法,其余情况直接访问属性。

设置特性

  1. setAttribute()接收两个字符串参数:name 和value;
  2. setAttribute()方法可以操作自定义特性;
  3. setAttribute()设置的特性名会自动转换为小写;
  4. 最佳实践:只有在设置自定义标签的时候才使用setAttribute()方法,其余情况直接操作属性;
  5. removeAttribute()用于彻底删除元素的特性和值,包括自定义特性;

attributes属性

  1. attributes属性是Element类型独有的;
  2. attributes属性是一个NamedNodeMap对象,类似NodeList,是由特性节点组成对象;
  3. NamedNodeMap对象中的每一项又是一个单独的特性节点,有nodeName,nodeValue等属性;
  4. NamedNodeMap对象拥有的方法
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            var _div = document.getElementById("123");
    
            // item()
            console.log(_div.attributes.item(1));  // 输出:style="height: 20px;"
    
            // getNamedItem()
            console.log(_div.attributes.getNamedItem("id"));  // 输出:id="123"
            console.log(_div.attributes.getNamedItem("id").nodeValue);  // 输出:123
    
            // removeNamedItem()
            console.log(_div.attributes.removeNamedItem("style"));  // 输出:style="height: 20px;"
    
            // setNamedItem()
            var newAttr = document.createAttribute("newAttr");
            newAttr.nodeValue = "456";
            _div.attributes.setNamedItem(newAttr);
        </script>
    </html>

     

  5. 使用attributes对象来操作元素节点的特性与直接使用getAttribute(), setAttribute(), removeAttribute()效果一致,attributes的方法可以找到别的简单的替代者;

  6. 针对attributes对象中的特性,不同浏览器返回的顺序不同;IE7会将没有指定的特性一并返回,需要使用NamedNodeMap中节点的specified属性检测是否为已定义特性

    console.log(_div.attributes[1].specified);  // 输出:true或false

     

  7. 最佳实践:只使用attributes属性对象来遍历元素的特性:

    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            function outputAttributes(element){
                var attrs = new Array(),
                    attrName,
                    attrValue,
                    i,
                    len;
    
                for(i = 0, len=element.attributes.length; i<len; i++){
                    attrName = element.attributes[i].nodeName;
                    attrValue = element.attributes[i].nodeValue;
                    if(element.attributes[i].specified){
                        attrs.push(attrName + '=\"' + attrValue + '\"');
                    }
                }
    
                return attrs.join(" ");
            }
            var _div = document.getElementById("123");
            console.log(outputAttributes(_div));
        </script>
    </html>

     

创建元素

  1. document.createElement()传入参数为标签名(小写):
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            var _div = document.createElement("div");
            _div.className = 'div';
            _div.innerHTML = 'Hi!';
            document.body.appendChild(_div);
        </script>
    </html>

     

  2. 可以创建自定义的非标准标签,例如:

    document.createElement("abc");

     

  3. 在IE8及以下可以传入整个元素标签,包括属性、content等,其他浏览器不支持;兼容性写法:

    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            if(document.documentMode && document.documentMode <= 8){
                var div = document.createElement('<div class=\"demo\">Content</div>');
            }else{
                var div = document.createElement('div');
                div.calssName = 'div';
                div.innerHTML = 'Content';
            }
        </script>
    </html>

     

元素的子节点

  1.  不同的浏览器对待元素间的空白符的解析不同。低版本IE会忽略元素之间的无用的空白符,其他浏览器会将空白符视作一个文本节点;

  2.  

    需要对元素的childNodes进行操作时,通常先检测一下nodeType属性:

     
    <!DOCTYPE html>
    <html>
        <body>
            <div id="123" style="height: 20px;">123</div>
        </body>
        <script>
            var element = document.getElementById("123");
            for(var i=0; i<element.childNodes.length; i++){
                if(element.childNodes[i].nodeType == 1){
                    // do something
                }
            }
        </script>
    </html>

     

元素尺寸与位置

关于滚动条:

页面的滚动条是属于html元素的,而不是body元素的

滚动条的宽度是包含在元素的宽度里面的

document.documentElement.clientTop和document.documentElement.clientLeft访问的是盒子上边框和左边框的值;

<think>好的,用户想了解Element类型在编程中的解析和用法。首先,我需要整合提供的引用资料,确保信息准确。根据引用[2],Element类型用于表现XML或HTML元素,可以访问标签名、子节点和特性。要获取标签名,可以使用tag属性,这在Python的ElementTree和JavaScript中都适用。 接下来,用户可能需要知道如何操作子节点。引用[3]提到子节点可以是多种类型,比如Element、Text等。在Python中,ElementTree的append和extend方法用于添加子元素,如引用[1]和[4]所示。查找特定节点可以用find或findall,如引用[5]所述。此外,处理属性方面,引用[4]提到属性类似字典,可以通过get方法获取。 还要考虑不同编程语言的差异。比如,JavaScript中的Element类型可能和Python的ElementTree库有所不同,需要分开说明。用户可能关心实际应用,比如解析XML文件或处理HTML文档,所以给出示例代码会更有帮助。最后,生成相关问题时要覆盖解析方法、属性操作、子节点管理和跨语言对比,确保全面性。</think>### Element类型解析及编程应用 #### 一、Element类型基础 1. **定义与作用** Element类型用于表现XML或HTML元素,提供对**标签名、子节点及属性**的访问[^2]。例如在XML解析中,`<foo lang="EN">`对应一个Element对象,其标签名为`foo`,属性`lang`值为`EN`[^4]。 2. **标签名获取** 通过`tag`属性可直接获取元素名称。例如在Python中: ```python import xml.etree.ElementTree as ET root = ET.parse('data.xml').getroot() print(root.tag) # 输出根元素标签名 ``` #### 二、子节点与属性操作 1. **子节点管理** - 子节点可能是Element、Text、Comment等类型[^3] - **添加子节点**:Python中可用`append()`添加单个子元素,`extend()`批量添加序列[^1] ```python parent = ET.Element("parent") child = ET.SubElement(parent, "child") # 添加子节点 ``` 2. **属性操作** - 属性以字典形式存储,可通过`attrib`属性或`get()`方法访问[^4] ```python element.set("id", "001") # 设置属性 print(element.get("id")) # 输出: 001 ``` #### 三、节点查询与遍历 1. **精准查找** 使用`find('tag')`查找首个匹配子节点,`findall('tag')`返回所有匹配节点[^5]: ```python for node in root.findall('book'): print(node.attrib['title']) ``` 2. **迭代遍历** 通过`iter()`递归遍历所有子节点: ```python for elem in root.iter('author'): print(elem.text) ``` #### 四、跨语言实现对比 | 功能 | Python (ElementTree) | JavaScript (DOM API) | |---------------|------------------------------------|-----------------------------------| | **获取标签名** | `element.tag` | `element.tagName` | | **属性读取** | `element.get('attr')` | `element.getAttribute('attr')` | | **子节点访问** | `list(element)` 或 `element[i]` | `element.childNodes` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mannuandeyangguang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值