JS HTML DOM

  1. 云栖社区>
  2. 博客>
  3. 正文

JS HTML DOM

webmirror 发布时间:2017-06-01 16:09:18 浏览4580 评论0

摘要: 通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

什么是 DOM

DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:

"W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"

W3C DOM 标准被分为 3 个不同的部分:

核心 DOM - 针对任何结构化文档的标准模型

XML DOM - 针对 XML 文档的标准模型

HTML DOM - 针对 HTML 文档的标准模型

注意:DOM 是 Document Object Model(文档对象模型)的缩写

什么是 HTML DOM

HTML DOM 是:

HTML 的标准对象模型;HTML 的标准编程接口;W3C 标准

HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准

HTML DOM(文档对象模型)

通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML

JavaScript 能够改变页面中的所有 HTML 元素

JavaScript 能够改变页面中的所有 HTML 属性

JavaScript 能够改变页面中的所有 CSS 样式

JavaScript 能够对页面中的所有事件做出反应

DOM Nodes

在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

整个文档是一个文档节点。每个 HTML 元素是元素节点。HTML 元素内的文本是文本节点。每个 HTML 属性是属性节点。注释是注释节点

节点父、子和同胞

节点树中的节点彼此拥有层级关系。父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

在节点树中,顶端节点被称为根(root)。每个节点都有父节点、除了根(它没有父节点)。一个节点可拥有任意数量的子。同胞是拥有相同父节点的节点

这里有两个特殊的属性,可以访问全部文档:

document.documentElement - 全部文档

document.body - 文档的主体

查找 HTML 元素

通常,通过JavaScript,您需要操作 HTML 元素。为了做到这件事情,您必须首先找到该元素。有三种方法来做这件事:

1.通过 id 找到 HTML 元素

在 DOM 中查找 HTML 元素的最简单的方法,是通过使用元素的 id

var x=document.getElementById("intro");

如果找到该元素,则该方法将以对象(在 x 中)的形式返回该元素。如果未找到该元素,则 x 将包含 null

2.通过标签名找到 HTML 元素

var x=document.getElementById("main");
var y=x.getElementsByTagName("p");

3.通过类名找到 HTML 元素

var x=document.getElementsByClassName("intro");

HTML DOM 改变 HTML 内容

HTML DOM 允许 JavaScript 改变 HTML 元素的内容

改变 HTML 输出流

JavaScript 能够创建动态的 HTML 内容:

document.write(Date());//显示今天的日期

绝对不要在文档加载完成之后使用 document.write()。这会覆盖该文档

改变 HTML 内容

修改 HTML 内容的最简单的方法时使用 innerHTML 属性。

如需改变 HTML 元素的内容,请使用这个语法:

document.getElementById(id).innerHTML=new HTML

除了 innerHTML 属性,您也可以使用 childNodes 和 nodeValue 属性来获取元素的内容

var txt=document.getElementById("intro").childNodes[0].nodeValue;
document.write(txt);

改变 HTML 属性

如需改变 HTML 元素的属性,请使用这个语法:

document.getElementById(id).attribute=new value

例如:

document.getElementById("image").src="landscape.jpg";

常用的 HTML DOM 方法:

方法 描述
getElementById() 返回带有指定 ID 的元素
getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)
getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表
appendChild() 把新的子节点添加到指定节点
removeChild() 删除子节点
replaceChild() 替换子节点
insertBefore() 在指定的子节点前面插入新的子节点
createAttribute() 创建属性节点
createElement() 创建元素节点
createTextNode() 创建文本节点
getAttribute() 返回指定的属性值
setAttribute() 把指定属性设置或修改为指定的值

常用的 HTML DOM 属性:

innerHTML - 节点(元素)的文本值

parentNode - 节点(元素)的父节点

childNodes - 节点(元素)的子节点

attributes - 节点(元素)的属性节点

HTML DOM 改变 CSS

HTML DOM 允许 JavaScript 改变 HTML 元素的样式

语法:

document.getElementById(id).style.property=new style

例如:

<script>
    document.getElementById("p2").style.color="blue";
</script>

<button type="button" onclick="document.getElementById('id1').style.color='red'">
Click Me!</button>

HTML DOM 事件

HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应

HTML 事件属性

如需向 HTML 元素分配 事件,您可以使用事件属性。

//向 button 元素分配 onclick 事件:
<button onclick="displayDate()">Try it</button>

在上面的例子中,名为 displayDate 的函数将在按钮被点击时执行

使用 HTML DOM 来分配事件

HTML DOM 允许您使用 JavaScript 来向 HTML 元素分配事件:

//向 button 元素分配 onclick 事件:
<script>
document.getElementById("myBtn").onclick=function(){displayDate()};
</script>

在上面的例子中,名为 displayDate 的函数被分配给 id=myButn" 的 HTML 元素。
按钮点击时Javascript函数将会被执行

onload 和 onunload 事件

onload 和 onunload 事件会在用户进入或离开页面时被触发

onload 事件可用于检测访问者的浏览器类型和浏览器版本,并基于这些信息来加载网页的正确版本

onload 和 onunload 事件可用于处理 cookie。

<body onload="checkCookies()">

onchange 事件

onchange 事件常结合对输入字段的验证来使用。

下面是一个使用onchange的例子。当用户改变输入字段的内容时,会调用upperCase()函数

<input type="text" id="fname" onchange="upperCase()">

onmouseover 和 onmouseout 事件

onmouseover和onmouseout事件可用于在用户的鼠标移至HTML元素上方或移出元素时触发函数

<div onmouseover="mOver(this)" onmouseout="mOut(this)">Mouse Over Me</div>
<script>
    function mOver(obj){
        obj.innerHTML="Thank You"
    }
    function mOut(obj){
        obj.innerHTML="Mouse Over Me"
    }
</script>

onmousedown、onmouseup 以及 onclick 事件

onmousedown, onmouseup以及onclick构成了鼠标点击事件的所有部分。首先当点击鼠标按钮时会触发onmousedown事件,当释放鼠标按钮时,会触发onmouseup事件,最后,当完成鼠标点击时,会触发onclick事件

onfocus 事件

<script>
    function myFunction(x){
        x.style.background="yellow";
    }
</script>
输入你的名字: <input type="text" onfocus="myFunction(this)">

HTML DOM EventListener

addEventListener() 方法

addEventListener()方法用于向指定元素添加事件句柄

addEventListener()方法添加的事件句柄不会覆盖已存在的事件句柄

可以向一个元素添加多个事件句柄

可以向同个元素添加多个同类型的事件句柄,如:两个 "click" 事件

可以向任何DOM对象添加事件监听,不仅仅是HTML元素。如:window对象

addEventListener()方法可以更简单的控制事件(冒泡与捕获)

当你使用addEventListener()方法时, JavaScript从HTML标记中分离开来,可读性更强, 在没有控制HTML标记时也可以添加事件监听

你可以使用removeEventListener()方法来移除事件的监听。

语法

element.addEventListener(event, function, useCapture);

第一个参数是事件的类型 (如 "click" 或 "mousedown")

第二个参数是事件触发后调用的函数

第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的

例如:

document.getElementById("myBtn").addEventListener("click", displayDate);

向原元素添加事件句柄

element.addEventListener("click", function(){ alert("Hello World!"); });

可以使用函数名,来引用外部函数:

element.addEventListener("click", myFunction);
function myFunction() {
    alert ("Hello World!");
}

向同一个元素中添加多个事件句柄

addEventListener() 方法允许向同个元素添加多个事件,且不会覆盖已存在的事件:

element.addEventListener("click", myFunction);
element.addEventListener("click", mySecondFunction);

也可以向同个元素添加不同类型的事件:

element.addEventListener("mouseover", myFunction);
element.addEventListener("click", mySecondFunction);
element.addEventListener("mouseout", myThirdFunction);

向 Window 对象添加事件句柄

addEventListener()方法允许在HTML DOM对象添加事件监听,HTML DOM对象如:HTML元素, HTML文档, window对象。或者其他支出的事件对象如:xmlHttpRequest对象。

当用户重置窗口大小时添加事件监听:

window.addEventListener("resize", function(){//resize:重置浏览器窗口大小
    document.getElementById("demo").innerHTML = sometext;
});

传递参数

当传递参数值时,使用"匿名函数"调用带参数的函数:

var p1 = 5;
var p2 = 7;
document.getElementById("myBtn").addEventListener("click", function() {
    myFunction(p1, p2);
});
function myFunction(a, b) {
    var result = a * b;
    document.getElementById("demo").innerHTML = result;
}

事件冒泡或事件捕获

事件传递有两种方式:冒泡与捕获

事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到<div>元素中,用户点击<p>元素, 哪个元素的 "click" 事件先被触发呢?

在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即:<p>元素的点击事件先触发,然后会触发<div>元素的点击事件

在捕获中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即:<div>元素的点击事件先触发 ,然后再触发<p>元素的点击事件

addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:

默认值为 false, 即冒泡传递,当值为 true 时, 事件使用捕获传递

removeEventListener() 方法

removeEventListener() 方法移除由 addEventListener() 方法添加的事件句柄:

element.removeEventListener("mousemove", myFunction);

例子:

document.getElementById("myDIV").addEventListener("mousemove",myFunction);
function myFunction() {
    document.getElementById("demo").innerHTML = Math.random();
}
function removeHandler() {
    document.getElementById("myDIV").removeEventListener("mousemove",myFunction);
}

注意:IE8及更早IE版本,Opera7.0及其更早版本不支持addEventListener()和removeEventListener()方法。但是,对于这类浏览器版本可以使用detachEvent()方法来移除事件句柄:

element.attachEvent(event, function);
element.detachEvent(event, function); 

例如:

var x = document.getElementById("myBtn");
if (x.addEventListener) {
    x.addEventListener("click", myFunction);
} else if (x.attachEvent) {
    x.attachEvent("onclick", myFunction);
}
function myFunction() {
    alert("Hello World!");
}

HTML DOM 事件对象

HTML DOM 事件

HTML DOM事件允许Javascript在HTML文档元素中注册不同事件处理程序,事件通常与函数结合使用,函数不会在事件发生前被执行!(如用户点击按钮)

具体事件可以查看我以前的文章:[HTML DOM 事件对象]: https://yq.aliyun.com/articles/74652?spm=5176.8091938.0.0.oHusXw " Optional Title Here"

方法

方法 描述 DOM
initMouseEvent() 初始化鼠标事件对象的值 2
initKeyboardEvent() 初始化键盘事件对象的值 3

HTML DOM 元素

创建新的 HTML 元素

如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素

var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);//把文字插入新建节点p
var element=document.getElementById("div1");
element.appendChild(para);//把新建节点p插入原节点div

删除已有的 HTML 元素

var parent=document.getElementById("div1");
var child=document.getElementById("p1");
parent.removeChild(child);//把节点div中节点p删除

如果能够在不引用父元素的情况下删除某个元素,就太好了。不过很遗憾。DOM 需要清楚您需要删除的元素,以及它的父元素。这是常用的解决方案:找到您希望删除的子元素,然后使用其 parentNode 属性来找到父元素:

var child=document.getElementById("p1");
child.parentNode.removeChild(child);
【云栖快讯】云栖专辑 | 阿里开发者们的第20个感悟:好的工程师为人写代码,而不仅是为编译器  详情请点击

网友评论