热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

JavaScriptDOM基础

这篇文章主要介绍了JavaScript的DOM基础知识,需要的朋友可以参考下

 DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口);

 DOM描绘了一个层次化的节点树,运行开发人员可以添加/移除和修改页面的某一部分;

一 DOM介绍

 D(文档):可以理解为整个Web加载的网页文档;
 O(对象):可以理解为类似window对象之类的东西,可以调用属性和方法,这里说的是document对象;
 M(模型):可以理解为网页文档的树形结构;

1.节点

 加载HTML页面时,Web浏览器生成一个树形结构,用来表示页面内部结构;
 DOM将这种节点结构理解为由节点组成;
 html元素为根节点;head元素是html的子节点;meta元素和title元素之间是兄弟关系;

 
 2.节点种类:元素节点/文本节点/属性节点

测试Div

 元素节点 => div;
 属性节点 => title="元素属性"
 文本节点 => 测试Div二 查找元素
 W3C提供了比较方便简单的定位节点的方法和属性,以便我们快速的对节点进行操作;
 DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口);

 DOM描绘了一个层次化的节点树,运行开发人员可以添加/移除和修改页面的某一部分;

元素节点查找方法
    方法                               说明
getElementById()              获取特定ID元素的节点;
getElementsByTagName()        获取相同元素的节点列表;
getElementsByName()           获取相同名称的节点列表;
getAttribute()                获取特定元素节点属性的值;
setAttribute()                设置特定元素节点属性的值;
removeAttribute()             移除特定元素节点属性;

1.getElementById()

// 方法接收一个参数:获取元素的ID;
// 如果找到相应的元素则返回该元素的HTMLDivElement对象;如果不存在,则返回null;
    document.getElementById('box');              // [object HTMLDivElement];
// 当我们通过getElementById()获取到特定元素节点时,这个节点对象就被我们获取到了;
// 而通过这个节点对象,我们可以访问它的一系列属性;
(1).访问元素节点的属性
    属性                             说明
    tagName                     获取元素节点的标签名;
    innerHTML                   获取元素节点里的内容,非W3C DOM规范;
    document.getElementById('box').tagName;      // =>DIV;
    document.getElementById('box').innerHTML;    // =>测试Div;

(2).访问HTML通用属性
    属性                             说明
    id                           元素节点的id名称;
    title                        元素节点的title属性值;
    style                        CSS内联样式属性值;
    className                    CSS元素的类;

    document.getElementById('box').id;           // =>id;
    document.getElementById('box').title;        // 获取title;

    document.getElementById('box').style;        // 获取CSSStyleDeclaration对象;
    document.getElementById('box').style.color;  // 获取style对象中的color的值;也就是设置在元素行内的样式值;
    document.getElementById('box').style.color='red';    // 设置style对象中的color的值;

    document.getElementById('box').className;    // 获取class;
    document.getElementById('box').className='pox';      // 设置class;

    document.getElementById('box').bbb;          // 获取自定义属性的值,非IE不支持;


2.getElementsByTagName()
// 方法返回一个对象数组HTMLCollection(NodeList)数组,这个数组保存着所有相同元素名的节点列表;
    document.getElementsByTagName('*');         // 利用通配符获取所有元素;
    // PS:IE在使用通配符时,会把文档最开始的html的规范声明当作第一个元素节点;

    document.getElementsByTagName('li');        // =>[object HTMLCollection];获取所有li元素;
    document.getElementsByTagName('li').[0];    // 获取第一个li元素;

3.getElementsByName()

 获取相同名称(name)设置的元素,返回一个对象数组HTMLCollection(NodeList);
     document.getElementsByName('add');          // 获取具有name='add'的input元素集合;
     // PS:对于并不是HTML合法的属性,那么在JS获取的兼容性上也会存在差异;
     // IE支持合法的name属性,但对于自定义的属性会出现不兼容问题;

4.getAttribute()
 方法将获取元素中某个属性值;
 但它和直接使用".attr"获取属性值的方法有一定区别;
     document.getElementById('box').getAttribute('mydiv');    // 获取自定义属性值;
     document.getElementById('box').mydiv;                    // 获取自定义属性值,仅IE支持;

5.setAttribute()
 方法将设置元素中某个属性和值;接收两个参数:属性名和值;
 如果属性本身已存在,那么就会覆盖;
     document.getElementById('box').setAttribute('align','center');    // 设置属性和值;
     // PS:在IE7及以下,使用setAttribute()方法设置class和style属性没有效果;

6.removeAttribute()
 方法可以移除HTML属性;
     document.getElementById('box').removeAttribute('style');         // 移除style样式属性;

三 DOM节点

1.node节点属性

// 节点可以分为:元素节点/属性节点和文本节点;
// 这些节点都有三个属性:nodeName/nodeType和nodeValue;

                  信息节点属性
 节点类型            nodeName            nodeType         nodeValue 
   元素                 元素名称             1              null
   属性                 属性名称             2              属性值 
   文本                 #text               3              文本内容
   document.getElementById('box').nodeType;            // =>1; 元素节点;

2.层次节点属性
// 层次节点可以划分为:父节点与子节点/兄弟节点;

// 当我们获取其中一个元素节点的时候,就可以使用层次节点属性来获取它相关层次的节点;

节点关系示意图

层次节点属性
    属性                         说明
childNodes             读取当前元素节点的所有子节点;
firstChild             读取当前元素节点的第一个子节点;
lastChild              获取当前元素节点的最后一个子节点;
ownerDocument          获取该节点的文档根节点,相当于document;
parentNode             获取当前节点的父节点;
previousSibling        获取当前节点的前一个同级节点;
nextSibling            获取当前节点的后一个同级节点;
attributes             获取当前元素节点的所有属性节点集合;

(1).childNodes属性

 属性获取某一个元素节点的所有子节点,这些子节点包含元素节点和文本节点;
 PS:使用childNodes[n]返回子节点对象的时候,有可能返回的是元素子节点,比如:HTMLElement;
 也可能返回的是文本子节点,比如:Text;
 元素子节点可以使用nodeName或者tagName获取标签名称;而文本子节点可以使用nodeValue获取;
    var box = document.getElementById('box');
    for(var i=0; i          判断是元素节点,输出元素标签名;
        if(box.childNodes[i].nodeType === 1){
            console.log('元素节点:'+box.childNodes[i].nodeName);
         判断是文本节点,输出文本内容;
        }else if(box.childNodes[i].nodeType ===3){
            console.log('文本节点:'+box.childNodes[i].nodeValue);
        }
    }
     PS1:在获取到文本节点(重点在于已经不是元素节点)的时候,是无法使用innerHTML这个属性输出文本内容的;
     这个非标准的属性必须在获取元素节点的时候,才能输出里面包含的文本;
        alert(box.innerHTML);                                     innerHTML和nodeValue第一个区别;

     PS2:innerHTML和nodeValue在赋值的时候,nodeValue会把包含在文本里的HTML转义成特殊的字符,从而达到形成纯文本的效果;
     而innerHTML会解析文本里的特殊字符;
        box.childNodes[0].nodeValue = 'abc';     =>abc;
        box.innerHTML = 'abc';                   =>abc(样式加粗);

(2).firstChild和lastChild属性
 firstChild = childNodes[0];获取当前元素的第一个子节点;
 lastChild = childNodes[box.childNodes.length-1];获取当前元素最后一个子节点;

(3).ownerDocument属性
 返回该节点的文档对象根节点,返回的对象相当于document;
   alert(box.ownerDocument === document);                        // =>true;根节点;

(4).parentNode/previousSibling/nextSibling属性

parentNode:返回该节点的父节点;
 previousSibling:返回该节点的前一个同级节点;
 nextSibling:返回该节点的后一个同级节点;
    alert(box.parentNode.nodeName);                      // 获取父节点的标签名;
    alert(box.firstChild.nextSibling);                   // 获取第二个节点;
    alert(box.lastChild.previousSibling);                // 获取倒数第二个节点;

(5).attributes属性
 属性返回该节点的属性节点集合;
     alert(document.getElementById('box').attributes);    // =>NamedNodeMap;

(6).忽略空白文本节点

  var body = document.getElementsByTagName('body')[0];// 获取body元素节点;  
  alert(body.childNodes.length);           // 非IE=7;  IE=3;

  // PS:在非IE中,标准的DOM具有识别空白文本节点的功能,而IE自动忽略了;
  function filterSpaceNode1(nodes){
    // 新数组;
    var ret = [];
    for(var i=0; i

四 节点操作
// DOM不单单可以查找节点,也可以创建节点/复制节点/插入节点/删除节点和替换节点

节点操作方法
    方法                     说明
write()             这个方法可以把任意字符串插入到文档中;
createElement()     创建一个元素节点;
appendChild()       将新节点追加到子节点列表的末尾;
createTextNode()    创建一个文件节点;
insertBefore()      将新节点插入在前面;
replaceChild()      将新节点替换旧节点;
cloneNode()         复制节点;
removeChild()       移除节点;

(1).write()方法
// write()方法可以把任意字符串插入到文档中去;
document.write('

这是一个段落!

'); // 解析后文字;

(2).createElement()方法
createElement()方法可以创建一个元素节点;
document.createElement('p'); // [object HTMLParagraphElement];

(3).appendChild()方法
appendChild()方法将一个新节点添加到某个节点的子节点列表的末尾上;
var box = document.getElementById('box');
var p = document.createElement('p'); // 创建一个新元素节点

;
box.appendChild(p); // 把新元素节点

添加子节点末尾;

(4).createTextNode()方法
该方法创建一个文本节点;
var text = document.createTextNode('段落');
p.appendChild(text); // 将文本节点添加到子节点末尾;

(5).insertBefore()方法

// 该方法可以把节点添加到指定节点的前面;
  box.parentNode.insertBefore(p,box);      // 在
之前添加一个

; box.insertBefore(newNode,null); // 将newNode添加到box自列表的最后节点; //PS:insertBefore()方法可以给当前元素的前面创建一个节点,但没有提供给当前元素的后面创建一个节点; function insertAfter(newElement,targetElement){ // 得到父节点; var parent = targetElement.parentNode; // 如果最后一个子节点是当前元素,那么直接添加即可; if(parent.lastChild === targetElement){ parent.appendChild(newElement); }else{ // 否则,在当前节点的下一个节点之前添加;达成在当前节点后面添加节点的需求; parentNode.insertBefore(newElement,targetElement.nextSibling); } }

 (6).replaceChild()方法
该方法可以把节点替换成指定的节点;
box.parentNode.replaceChild(p,box); // 把

换成了

;

(7).cloneNode()方法

// 该方法可以把子节点复制出来;复制后返回的节点副本属于文档所有,但并没有为它指定父节点;
// 参数为true:执行深复制,就是复制节点及其整个子节点树;
// 参数为false:执行浅复制,只复制节点本身;
    var box = document.getElementById('box');
    var clOne= box.firstChild.cloneNode(true);        // 获取第一个子节点,true表示复制内容;
    box.appendChild(clone);                            // 添加到子节点列表末尾;

(8).removeChild()方法
该方法删除指定节点;
box.parentNode.removeChild(box);

小结:在下一章~


推荐阅读
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • 基于JQuery实现的评分插件
    本文介绍了一个使用JQuery创建的交互式评分控件。当用户将鼠标悬停在星星上时,左侧的星星会变为实心,右侧保持空心,并显示对应的评分等级;移开鼠标后,所有星星恢复为空心状态。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 本文详细介绍了JSP的三大指令:page、include和taglib,重点探讨了静态包含与动态包含的区别及其应用场景,并解释了如何使用taglib指令引入第三方标签库。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • 气象对比分析
    本文探讨了不同地区和时间段的天气模式,通过详细的图表和数据分析,揭示了气候变化的趋势及其对环境和社会的影响。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
author-avatar
缅甸菲菲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有