JavaScript——DOM(包括DOM简介、获取元素、事件基础、操作元素、节点操作)

DOM简介

  • 文档对象模型(DOM),就是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。

  • 作用:通过这些DOM接口,可以改变网页的内容、结构和样式。

  • DOM树:

    (1)文档:一个页面就是一个文档,DOM中使用document表示

    (2)元素:页面中所有标签都是元素,DOM中使用element表示

    (3)节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示

    (4)DOM把以上三种都看做是对象

获取元素

1.根据ID获取
  • 使用getElementById()方法获取带有ID的元素对象。小括号里的参数是大小写敏感的字符串ID名,并且返回的是一个元素对象,如果页面没有这个对象,则返回null。console.dir()方法可以返回元素对象,以便开发人员更好地查看里面的属性和方法。
document.getElementById('ID');
2.根据标签名获取
  • 使用getElementsBytagName()方法可以返回带有指定标签名的对象的集合。返回的是获取过来的元素对象的集合,以伪数组的形式存储,并且里面的每个元素都是对象。
  • 通过getElementsBytagName()方法得到的元素对象是动态的。
  • 如果页面中只有一个标签,返回值还是以伪数组的形式存在。
  • 如果页面中没有这个元素标签,返回值是一个空的伪数组。
document.getElemrntsByTagName('标签名');
  • 使用getElementsBytagName()方法还可以获取某个元素(父元素)内部所有指定标签名的子元素。(获取的时候不包括父元素自己)注意:父元素必须是单个对象。
element.getElemrntsByTagName('标签名');
3.通过HTML5新增的方法获取

(1)getElementsByClassName()

document.getElementsByClassName('类名');	//根据类名返回元素对象集合

(2)querySelector()

document.querySelector('选择器');		//根据指定选择器返回第一个元素对象
										//注意:里面的选择器要加符号,比如类就要加'.'

(3)querySelectorAll()

document.querySelectorAll('选择器');		//根据指定选择器返回所有的元素对象集合
4.获取特殊元素(body、html)
  • 获取body元素:
document.body		//返回body元素对象
  • 获取html元素:
document.documentElement		//返回html元素对象
5.拓展
  • 获取元素的方式可以是下面这种情况:
document.getElementById('ID').querySelectorAll('选择器');

事件基础

  • 事件三要素:事件源、事件类型和事件处理程序。

    (1)事件源:事件被触发的对象

    (2)事件类型:如何触发,比如:鼠标点击、鼠标经过

    (3)事件处理程序:通过一个函数赋值的方式完成

btn.onclick = function(){
  alert('蟹黄堡');
}
  • 执行事件的步骤:

    (1)获取事件源

    (2)注册事件(绑定事件)

    (3)添加事件处理程序(采取函数赋值的形式)

  • 常见的鼠标事件

鼠标事件触发条件
onclick鼠标点击左键触发
onmouserover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

操作元素

1.改变元素内容
element.innerText
  • 从起始位置到终止位置的内容,但它不识别html标签,同时去除空格和换行。(可读写的)
element.innerHTML
  • 起始位置到终止位置的全部内容,能够识别html标签,同时保留空格和换行。(可读写的)
2.常用元素的属性操作
  • src、href、id、alt、titile等属性都是可以通过“元素.属性“的方法修改属性值。
<button>阿拉斯加</button>
<button>柯基</button>
<img src="images/dog1.jpg" alt=''>
<script>
var dog1 =document.getElementById('dog1');
var dog2 =document.getElementById('dog2');
var img = document.querySelector('img');

dog2.onclick = function(){
  img.src = 'images/dog2.jpg';
}
dog1.onclick = function(){
  img.src = 'images/dog1.jpg';
}
</script>
3.表单元素的属性操作
  • type、value、checked、selected、disabled等表单元素的属性也都是可以通过“元素.属性“的方法修改属性值。(可读写)
4.样式属性操作
  • 修改元素大小、颜色、位置等样式等方法有以下两种:

    (1)element.style ——行内样式操作

    var div = document.querySelector('div');
    div.onclik = function(){
      this.style.background = 'blue';
    }
    

    注意:
    JS里面的样式采取驼峰命名法,比如:fontSize、backgroundColor;
    JS修改style样式操作,产生的是行内样式,css权重比较高。

    (2)element.className ——类名样式操作

    //css
    <style>
    .change{
      background-color: blue;
    	color: #fff;
      font-size: 20px;
    	margin-top: 100px;
    }
    </style>
    
    //html
    <div class="text">文本内容</div>
    
    //JS
    <script>
    var div = document.querySelector('div');
    div.onclik = function(){
      div.className = 'text change';
    }
    </script>
    

    注意:
    如果样式修改较多,可以采用操作类名方式更改元素样式;
    className会直接更改元素的类名,会覆盖原先的类名。

5.排他思想
  • 排他思想算法实现的步骤:顺序不能颠倒

    (1)所有元素全部清除样式

    (2)给当前元素设置样式

6.自定义属性的操作
(1)获取属性值
  • element.属性
  • Element.getAttribute(‘属性’)

区别:
element.属性:获取内置属性值(元素本身自带的属性)
element.getAttribute(‘属性’):主要获取自定义属性(程序员自定义的属性)

(2)设置属性值
  • element.属性 = ‘值’
  • element.setAttribute(‘属性’,‘值’)

区别:
element.属性 = ‘值’:获取内置属性值(元素本身自带的属性)
element.setAttribute(‘属性’,‘值’):主要设置自定义属性

var div = doucument.querySelector('div');
div.className = 'test';	
div.setAttribute('class','test');
(3)移除属性
  • element.removeAttribute(‘属性’)
7.H5自定义属性
  • 自定义属性的目的:为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
(1)设置H5自定义属性
  • H5规定自定义属性的属性名以data-开头。
(2)获取H5自定义属性
  • 兼容性获取,element.getAttribute(‘data-index’),该方法可以获取自定义属性,不管是否以data-开头。
  • H5新增element.dataset.index或者element.dataset[‘index’],ie11才开始支持,该方法只能获取以data-开头的自定义属性。其中,dataset是一个集合,里面存放了所有以data开头的自定义属性。如果自定义属性里面有多个以-链接的单词,获取的时候需要采用驼峰命名法,详情如下:
<div data-list-name = 'andy'></div>
<script>
  var div = document.querySelector('div');
	console.log(div.getAttribute('data-list-name'));
	console.log(div.dataset.listName);
	console.log(div.dataset['listName']);
</script>

节点操作

  • 学习节点操作的原因:利用节点层级关系(父子兄关系)获取元素比利用DOM提供的方法获取元素逻辑性更强,操作更简单。

  • 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。

  • HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以被创建或删除。

  • 一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)、nodeValue(节点值)这三个基本属性。

    元素节点的nodeType为:1

    属性节点的nodeType为:2

    文本节点的nodeType为:3(文本节点包含文字、空格、换行等)

1.父级节点
//父级节点的语法格式如下:
node.parentNode

var title = document.querySelector('.title');
console.log(title.parentNode);
  • parentNode属性返回的是某节点的父节点,注意是最近的一个父节点。
  • 如果指定的节点没有父节点,则返回null。
2.子节点
//子节点的语法格式1如下:
parentNode.childNodes(标准)
  • parentNode.chiledNodes返回包含指定节点的子节点的集合,该集合为及时更新的集合。

注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。

//如果只想要获得里面的元素节点,则需要专门处理,所以我们一般不提倡使用chileNodes
//只获取元素节点的处理如下:
var ul = document.querySelector('ul');
for(var i = 0; i < ul.childNodes.length; i++){
  if(ul.childNodes[i].nodeType == 1){
    console.log(ul.childNodes[i]);
  }
}
//子节点的语法格式2如下:
parentNode.children(非标准)
  • parentNode.children是一个只读属性,返回所有子元素节点。它只返回子元素节点,其余节点不返回。

  • 虽然children是一个非标准,但是得到了各个浏览器的支持,可以放心使用,并且我们经常使用的也是这个。

  • 获取第一个子元素和最后一个子元素:

方法一:

parentNode.firstChild
//firstChild返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。
parentNode.lastChild
//lastChild返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。

方法二(该方法有兼容性问题,IE9以上才支持):

parentNode.firstElementChild
//firstElementChild返回第一个子元素节点,找不到则返回null
parentNode.lastElementChild
//lastElementChild返回最后一个子元素节点,找不到则返回null

方法三(实际开发的写法,没有兼容性问题):

parentNode.children[0]
//获取第一个子元素节点
parentNode.children[parent.children.length - 1]
//获取最后一个子元素节点
3.兄弟节点
  • 方法一:
node.nextSibling
//extSibling返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。
node.previousSibling
//previousSibling返回当前元素上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。

//如果想要获取兄弟元素节点,则可以采取以下方法——封装函数:
function getNextElementSibling(element){
  var el = element;
  while(el = el.nextSibling){
    if(el.nodeType === 1){
      return el;
    }
  }
  return null;
}
  • 方法二(该方法有兼容性问题,IE9以上才支持):
node.nextElementSibling
//nextElementSibling返回当前元素的下一个兄弟元素节点,找不到则返回null。
node.priviousElementSibling
//priviousElementSibling返回当前元素的上一个兄弟节点,找不到则返回null。
4.创建和添加节点
  • 创建节点:
//创建节点的语法格式如下:
document.createElement('tagName');
  • document.createElement()方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们称为动态创建元素节点。

  • 添加节点:

//添加节点的语法格式1如下:
node.appendChild(child);		//node是父级,child是子级
  • node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾。
//添加节点的语法格式2如下:
node.insertBefore(child,指定元素);	//node是父级,child是子级
  • node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。
5.删除节点
//删除节点的语法格式如下:
node.removechild(child);		//node是父级,child是子级
  • node.removeChild()方法从DOM中删除一个子节点,返回删除的节点。
6.复制节点/克隆节点
//复制节点的语法格式如下:
node.cloneNode();
  • node.cloneNode()方法返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点。
  • 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
  • 如果括号参数为true,则是深拷贝,会复制节点本身以及里面所有的子节点。
7.三种动态创建元素的区别
  • document.write()

  • element.innerHTML

  • document.createElement()

  • 区别:

    document.write()是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘。

    innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘。

    innerHTML创建多个元素效率更高(前提是不要采用拼接字符串,而是采取数组形式),结构稍微复杂。

    createElement()创建多个元素效率稍微低一点点,但是结构更清晰。


微信公众号也会定期更新,觉得文章写得还可以的,可以加个关注!点个赞!谢谢!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值