DOM操作的基本方法

本文目录:

  • 1.获取元素
  • 2.动态创建元素
  • 3.对元素进行操作(属性、样式及节点遍历)
  • 4.事件(什么时机做相应的操作)

1.获取元素

1.1.根据id获取元素

var div = document.getElementById('main');

1.2.根据标签名获取元素

var divs = document.getElementsByTagName('div');------>获取到的是一个伪数组,需要进行遍历。
for (var i = 0; i < divs.length; i++) {
  var div = divs[i];
  console.log(div);
}

1.3.根据name获取元素

var inputs = document.getElementsByName('hobby');------>获取到的是一个伪数组,需要进行遍历。
for (var i = 0; i < inputs.length; i++) {
  var input = inputs[i];
  console.log(input);
}

1.4.根据类名获取元素

var mains = document.getElementsByClassName('main');---->获取到的是一个伪数组,需要进行遍历。
for (var i = 0; i < mains.length; i++) {
  var main = mains[i];
  console.log(main);
}

1.5.根据选择器获取元素

根据id选择器获取,获取到的是唯一的:

var text = document.querySelector('#text');

根据class选择器获取,获取到的是唯一的(带有该类名的第一个元素):

var trigger = document.querySelector('.trigger')

获取到的是一个伪数组,需要进行遍历:

var boxes = document.querySelectorAll('.box');
for (var i = 0; i < boxes.length; i++) {
  var box = boxes[i];
  console.log(box);
}

2.动态创建元素

2.1.document.write()

document.write('新设置的内容<p>标签也可以生成</p>');

上面这种方式创建元素的缺陷:如果是在页面加载完毕后,此时通过这种方式创建的元素,那么页面上存在的所有内容都会消失。

2.2.innerHTML

var box = document.getElementById('box');
box.innerHTML = '新内容<p>新标签</p>';

document.createElement()

  my$("btn").onclick = function () {
    //创建元素的
    var pObj = document.createElement("p");
    setInnnerText(pObj, "这是一个p");
    //把创建后的子元素追加到父级元素中
    my$("dv").appendChild(pObj);
  };

3.操作元素

3.1.属性操作

非表单元素的属性
如:href、title、id、src、className
可以直接获取到该元素,然后通过点的方式获得元素上的属性

var link = document.getElementById('link');
console.log(link.href);
console.log(link.title);
var pic = document.getElementById('pic');
console.log(pic.src);
  • innerHTML和innerText
var box = document.getElementById('box');
box.innerHTML = '我是文本<p>我会生成为标签</p>';
console.log(box.innerHTML);
box.innerText = '我是文本<p>我不会生成为标签</p>';
console.log(box.innerText);

表单元素属性

  • value 用于大部分表单元素的内容获取(option除外)
  • type 可以获取input标签的类型(输入框或复选框等)
  • disabled 禁用属性
  • checked 复选框选中属性
  • selected 下拉菜单选中属性

自定义属性操作

  • getAttribute() 获取标签行内属性
  • setAttribute() 设置标签行内属性
  • removeAttribute() 移除标签行内属性
  • 与element.属性的区别: 上述三个方法用于获取任意的行内属性。

3.2.样式操作

  • 使用style方式设置的样式显示在标签行内
var box = document.getElementById('box');
box.style.width = '100px';
box.style.height = '100px';
box.style.backgroundColor = 'red';
  • 注意
    通过样式属性设置宽高、位置的属性类型是字符串,需要加上px

3.3.类名操作

  • 修改标签的className属性相当于直接修改标签的类名
var box = document.getElementById('box');
box.className = 'clearfix';
//classList操作
ele.classList.contains('className'); //是否有该类
ele.classList.add('newClassName1,newClassName2...'); //添加类
ele.classList.remove('oldClassName1,newClassName2...'); //删除类
ele.classList.toggle('className'); //如果元素中有该className,则删除并返回false,否则添加并返回true

3.4.节点操作

节点操作,方法

  • appendChild()
  • insertBefore()
  • removeChild()
  • replaceChild()
    节点层次,属性
  • parentNode
  • childNodes
  • children
  • nextSibling/previousSibling
  • firstChild/lastChild

4.事件

4.1.事件三要素

  • 事件源:触发(被)事件的元素
  • 事件类型:事件的触发方式(例如鼠标点击或键盘点击)
  • 事件处理程序:事件触发后要执行的代码(函数形式)

4.2.注册/移除事件的三种方式

第一种方式:不可重复绑定,重复绑定的话会后来者覆盖前者。

var box = document.getElementById('box');
box.onclick = function () {
  console.log('点击后执行');
};
box.onclick = null;

第二种方式:存在兼容性问题,谷歌和火狐支持,ie8不支持。

box.addEventListener('click', eventCode, false);
box.removeEventListener('click', eventCode, false);

第三种方式:存在兼容性问题,ie8支持,谷歌和火狐不支持。

box.attachEvent('onclick', eventCode);
box.detachEvent('onclick', eventCode);

function eventCode() {
  console.log('点击后执行');
}
//元素绑定事件中,eventcode可为命名函数,也可为匿名函数。

兼容代码

function addEventListener(element, type, fn) {
  if (element.addEventListener) {
    element.addEventListener(type, fn, false);
  } else if (element.attachEvent){
    element.attachEvent('on' + type,fn);
  } else {
    element['on'+type] = fn;
  }
}

function removeEventListener(element, type, fn) {
  if (element.removeEventListener) {
    element.removeEventListener(type, fn, false);
  } else if (element.detachEvent) {
    element.detachEvent('on' + type, fn);
  } else {
    element['on'+type] = null;
  }
}

4.3.事件的三个阶段

  1. 捕获阶段
  2. 当前目标阶段
  3. 冒泡阶段
    事件对象.eventPhase属性可以查看事件触发时所处的阶段
    4.4.事件对象的属性和方法
  • event.type 获取事件类型
  • clientX/clientY 所有浏览器都支持,窗口位置
  • pageX/pageY IE8以前不支持,页面位置
  • event.target || event.srcElement 用于获取触发事件的元素
  • event.preventDefault() 取消默认行为
  • event.stopPropagation();阻止事件冒泡
  • arguments伪数组
my$  ( "dv3").onclick =function (){
​   console.log ( this.id );
​   console.log ( arguments.length )
​   //可以知道函数传入了几个参数
​   //此处输出为1
​   //虽function的( )里为空,但该事件在处理中会产生一个事件处理参数对象。
}

4.4.常用的事件类型

鼠标点击事件--->onclick
鼠标进入事件--->onmouseover
鼠标离开事件---->onmouseout
获取焦点事件---->onfocus
失去焦点事件---->onblur
键盘抬起事件---->onkeyup
鼠标移动事件---->onmousemove
容器滚动事件---->onscroll
按下鼠标事件---->onmousedown
鼠标抬起事件---->onmouseup
键盘按下事件---->onkeydown

4.4.1.鼠标事件

onmousedown 鼠标按下的时候触发的事件
onmouseup 当鼠标按下后抬起的时候触发的事件
onmousemove 当鼠标移动的时候触发
onmouseover 当鼠标移⼊的时候触发
onmouseout 当鼠标移出对象的时候触发
onclick 当鼠标单击的时候触发
ondblclick 鼠标双击的时候触发

4.4.2.键盘事件
  • onkeydown 当键盘按下的时候触发
  • onkeyup 当键盘按下抬起的⼀瞬间触发
4.4.3.表单事件

onsubmit 当⽤户点击submit按钮来提交表单时,就会触发表单的onsubmit事件,如果事件处理程序返回false,就会阻止表单提交,表单就不会发送数据到服务器。

  • onchange 修改表单字段的时候触发该事件
  • onfocus 当获取到焦点到时候触发
  • onblur 当失去焦点的时候触发
4.4.4.窗口事件

onload 元素加载完成时触发,常用的就是window.onload

window.onload = function(){
//等页面加载完成时执行这里的代码
}

onresize 当浏览器窗口尺寸改变的时候触发

window.onresize = function(){
alert(1)
}

4.5.事件的event对象

event对象代表事件的状态,当事件发生的时候用来记录事件的详细信息,类似于飞机的黑匣子
在ie和chrome中,事件对象(event)是一个内置的全局对象,必须在事件调用的时候才有值,如果没有事件调用,event没有值,在firefox中event对象没有被定义,如果这个函数被事件调用,那么这个事件函数中的第⼀个参数就是event对象,这也是标准浏览器下的处理模式,在非标准下,这种方式不被采纳。

总结:在非标准下,使用被定义好的event内置对象,在标准下使用事件函数中的第一个参数,假设传递的第一个参数为e,可以用逻辑或做兼容,var e = e || event

4.5.1.event对象上的属性 clientX,clientY

clientX 事件属性返回当事件被触发时⿏标指针向对于浏览器窗口(或客户区)的水平坐标。clientY 事件属性返回当事件被触发时鼠标指针向对于浏览器窗口(客户区)的垂直坐标。

4.5.2.event对象上的keycode属性

对于 keypress 事件,该属性声明了被敲击的键⽣成的 Unicode 字符码。对于 keydown 和 keyup 事件,它指定了被敲击的键的虚拟键盘码。虚拟键盘码可能和使用的键盘的布局相关。

示例:用方向键控制box元素移动

//通过键盘控制⽅向
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <script type="text/javascript">
    window.onload = function(){
      //获取到box对象
      var oBox = document.getElementById('box');
      //定义x y轴的增量
      var x = y= 0;
      //键盘按下事件
      document.onkeydown = function(e){
      //事件兼容
      var e = e || event;
      //上38 下 40 左37 右39
      switch(e.keyCode){
        case 38:
        y -= 10;
        break;
        case 40:
        y += 10;
        break;
        case 37:
        x -= 10;
        break;
        case 39:
        x += 10;
        break;
      }
      //改变偏移量
      oBox.style.left = x + "px";
      oBox.style.top = y + "px";
    }
  }
</script>
<style type="text/css">
  #box{
    width: 100px;
    height: 100px;
    background: red;
    position: absolute;
  }
</style>
</head>
<body>
  <div id="box">
  </div>
</body>
</html>
4.5.3.阻止事件冒泡

当⼀个元素接收到⼀个事件以后,会将事件传播给它的⽗级元素,它的父级元素会一层一层往上传播,直到最顶层window,这种事件传播机制叫作事件冒泡。
在实际开发中我们通常需要阻止事件冒泡,做法是将event对象上的cancelBubble/stopPropagation属性设置成true、
兼容性写法:

function stopBubble(e) { 
   if(e && e.stopPropagation) { //非IE 
       e.stopPropagation(); 
   } else { //IE 
       window.event.cancelBubble = true; 
   } 
} 

w3c:event.stopPropagation()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,483评论 1 11
  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,232评论 1 41
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,113评论 0 21
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,331评论 0 8
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,168评论 0 3