javascript学习8、DOM对象

一.什么是DOM

DOM:文档对象模型。DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。目的其实就是为了能让js操作html元素而制定的一个规范。

DOM就是由节点组成的。

(1)解析过程

HTML加载完毕,渲染引擎会在内存中把HTML文档,生成一个DOM树,getElementById是获取内中DOM上的元素节点。然后操作的时候修改的是该元素的属性。

(2)DOM树(一切都是节点)

DOM的数据结构如下:

 

上图可知,在HTML当中,一切都是节点:(非常重要)

  • 元素节点:HMTL标签。

  • 文本节点:标签中的文字(比如标签之间的空格、换行)

  • 属性节点::标签的属性。

整个html文档就是一个文档节点。所有的节点都是Object。

(3)DOM可以做什么

  • 找对象(元素节点)

  • 设置元素的属性值

  • 设置元素的样式

  • 动态创建和删除元素

  • 事件的触发响应:事件源、事件、事件的驱动程序

 

二.查找元素

如果我们想用js操作文档,首先要做的便是要找到要操作的元素,查找元素有直接查找和间接查找,下面来看一下这两类查找,

1、直接查找

document.getElementById             根据ID获取一个标签           <div id='id1'></div>
document.getElementsByClassName     根据class属性获取标签数组     <div class='class1'></div>
document.getElementsByTagName       根据标签名获取标签数组        <div></div>
document.getElementsByName          根据name属性获取标签数组      <div name='test'></div>

2、间接查找(一般都是和直接找配合使用) 

var ele=document.getElementById('id1')  //先获取标签对象

ele.nodeName // 获取当前对象的标签
ele.length // 获取当前对象标签个数 ele.parentElement
// 父节点标签元素 ele.children // 所有子标签 ele.firstElementChild // 第一个子标签元素 ele.lastElementChild // 最后一个子标签元素 ele.nextElementtSibling // 下一个兄弟标签元素 ele.previousElementSibling // 上一个兄弟标签元素

3.局部查找,id和name是不支持的

<div id="div1">

    <div class="div2">i am div2</div>
    <div name="yuan">i am div2</div>
    <div id="div3">i am div2</div>
    <p>hello p</p>
</div>

<script>

   var div1=document.getElementById("div1");

////支持;
//   var ele= div1.getElementsByTagName("p");
//   alert(ele.length);
////支持
//   var ele2=div1.getElementsByClassName("div2");
//   alert(ele2.length);
////不支持
//   var ele3=div1.getElementById("div3");
//   alert(ele3.length);
////不支持
//   var ele4=div1.getElementsByName("yuan");
//   alert(ele4.length)

</script>

 

三.操作

1、创建标签(两种方式)

// 方式一
var tag = document.createElement('a')
tag.innerText = "xiaozhiqi"
tag.className = "c1"
tag.href = "http://www.cnblogs.com/xiaozhiqi"
  
xxx.appendChild(tag)
xxx.insertBefore(tag,xxx[1])

// 方式二
var tag = "<a class='c1' href='http://www.cnblogs.com/xiaozhiqi'>xiaozhiqi</a>"

xxx.insertAdjacentHTML("beforeEnd",obj);
xxx.insertAdjacentElement('afterBegin',document.createElement('p'))
  
//注意:第一个参数只能是'beforeBegin'、 'afterBegin'、 'beforeEnd'、 'afterEnd'

2、标签中的内容

操作内容主要是 innerText,innerHTML和value其中前两种比较简单,主要是第三种在操作表单的时候,用得最多,text,password和textarea的value可以分为一类,checkbox,radio和select的value可以分为一类

<a>hello div</a>
var ele=document.getElementsByTagName('a')[0]
ele.innerText
// a标签中的文本内容 ele.innerHTML // HTML内容,比如<a><span>aaa</span></a>中的<span>标签 ele.value // input标签中的值

3、操作属性

除了操作内容,还可以操作标签属性,主要用到下面几个方法

<div class='test' id='id1' name='tx1'>hellp</div>

var ele=document.getElementById('id1')
ele.attributes                // 获取所有标签属性
ele.setAttribute(key,value)   // 设置标签属性
ele.getAttribute(key)         // 获取指定标签属性
  
/*
var atr = document.createAttribute("class");
atr.nodeValue="democlass";
document.getElementById('n1').setAttributeNode(atr);
*/

4、class操作

<div class='test test23' id='id1' name='tx1'>hellp</div>

var ele=document.getElementById('id1')
ele.className                 // 获取所有类名,字符串格式
ele.classList                 // 获取所有类名,列表格式
ele.classList.remove('test23')     // 删除指定类
ele.classList.add('test45')        // 添加类

5、样式操作 

ar obj = document.getElementById('i1')
  
obj.style.fontSize = "32px";
obj.style.backgroundColor = "red";

6、位置操作

document.documentElement.offsetHeight  //总文档高度
document.documentElement.clientHeight   //当前文档占屏幕高度
tag.offsetHeight  //自身高度
tag.offsetTop   //距离上级定位高度
tag.offsetParent  //父定位标签
tag.scrollTop  //滚动高度
  
/*
clientHeight -> 可见区域:height + padding
clientTop    -> border高度
offsetHeight -> 可见区域:height + padding + border
offsetTop    -> 上级定位标签的高度
scrollHeight -> 全文高:height + padding
scrollTop    -> 滚动高度
特别的:
   document.documentElement代指文档根节点
*/

 

四.事件

 HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

onfocus        元素获得焦点。               //练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。
onload         一张页面或一幅图像完成加载。
onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect      文本被选中。
onsubmit      确认按钮被点击。

1.两种绑定事件方式

//第一种方式
<div onclick="alert(123)">点我呀</div>
<p id="abc">试一试!</p>

//第二种方式
<script>
    var ele=document.getElementById("abc");

    ele.onclick=function(){
        alert("hi");
    };

</script>

注意:

<div id="abc" onclick="func1(this)">事件绑定方式1</div>
<div id="id123">事件绑定方式2</div>
<script>
    function func1(self){
        console.log(self.id)
    }

    //jquery下是$(self), 这种方式this参数必须填写;

//------------------------------------------
    var ele=document.getElementById("id123").onclick=function(){
         console.log(this.id);
        //jquery下是$(this), 这种方式不需要this参数;
    }
    
</script>

onload:

onload 属性开发中 只给 body元素加.
这个属性的触发 标志着 页面内容被加载完成.
应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性.

<script>
//    window.onload=function(){
//        var ele=document.getElementById("ppp");
//        ele.onclick=function(){
//             alert(123)
//        };
//    };

function fun1() {
    var ele=document.getElementById("ppp");
    ele.onclick=function(){
         alert(123)
     };
}

</script>

<body onload="fun1()">
    <p id="ppp">hello p</p>
</body>

onsubmit:

是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.

<form id="form">
    <input type="text"/>
    <input type="submit" value="点我!" />
</form>

<script type="text/javascript">
    //阻止表单提交方式1().
    //onsubmit 命名的事件函数,可以接受返回值. 其中返回false表示拦截表单提交.其他为放行.

    var ele=document.getElementById("form");
    ele.onsubmit=function(event) {
//   alert("验证失败 表单不会提交!");
//   return false;
                
    // 阻止表单提交方式2 event.preventDefault(); ==>通知浏览器不要执行与事件关联的默认动作。
    alert("验证失败 表单不会提交!");
    event.preventDefault();
    }
</script>

Event 对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.

比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就时KeyCode;

思考:onclick=function(event){};这个方法是谁调用的?

事件传播:

<div id="abc_1" style="border:1px solid red;width:300px;height:300px;">
    <div id="abc_2" style="border:1px solid red;width:200px;height:200px;"></div>
</div>
<script type="text/javascript"> document.getElementById("abc_1").onclick=function(){ alert('111'); } document.getElementById("abc_2").onclick=function(event){ alert('222'); event.stopPropagation(); //阻止事件向外层div传播. } </script>

 

posted @ 2019-06-07 16:41  Python自动化运维之路  阅读(191)  评论(0)    收藏  举报