HTML DOM基本概念及Element.getAttribute("value") 与Attribute.value差异

今晚整理博客的时候写个js, 发现了一个坑.. 一不小心就掉进去的坑..

本来想针对此坑写写见解就完了, 但觉得趁这个机会顺便再次说一下HTML DOM相关的东东.

在开始之前我先引出几个问题, 由此引出后面的话题, 也算是作为本人个人的学习笔记, 与大家共勉.

我们先来提3个问题.

HTML DOM是什么?

HTML DOM 的全称为: HTML Document Object Model, 意思是: 文档对象模型. 我们常说的DOM, 就是HTML DOM. DOM是对HTML文档里所有的一个统称, 一个规范.

打开 w3c的网站 http://www.w3school.com.cn/htmldom/index.asp

这里对HTML DOM做出了解释.

第一句话就是:

HTML DOM 定义了访问和操作 HTML 文档的标准方法。

DOM 将 HTML 文档表达为树结构。

由上面我们可以知道, HTML DOM只是一种定义, 用来定义HTML文档的访问和操作的一种方法而已.

那么图中的HTML DOM树, 就是用HTML DOM用来将HTML的结构定义成一种树状结构而已.

在点开http://www.w3school.com.cn/htmldom/dom_intro.asp这个页面, 可以看到这么一段.

w3c又说DOM是W3C的标准. 可见, DOM只是用来定义HTML的一种规范一个标准而已.

HTML DOM节点是什么?

由上面我们知道DOM是用来定义东西的.

那么他是怎么定义的呢?

打开http://www.w3school.com.cn/htmldom/dom_nodes.asp, 看到下面的这个说明.

那么我们知道DOM是把HTML中的所有东西都定义成节点, 或者通俗点的说在DOM的世界里他认为HTML文档中的所有东西都是节点(理解一下这个加粗的文本).

把节点分为以下5个类型.

1. 整个文档是一个文档节点

2. 每个 HTML 元素是元素节点

3. HTML 元素内的文本是文本节点

4. 每个(HTML元素中的) HTML 属性是属性节点

5. 注释是注释节点

好了, 通过这个, 我们知道HTML DOM节点是上面的那5种类型.

那么有人之前可能还疑惑HTML元素和HTML DOM节点什么关系? 其实通过上面, 我们已经知道HTML元素只是HTML DOM节点的其中一种类型.

但我们大多数人一想到HTML DOM节点就会条件反射的认为不就是HTML元素嘛, 其实不然, HTML元素只是HTML DOM节点的中的一种.

注意: 虽然HTML元素(节点)只是DOM节点的一种, 但我们操作DOM节点时, 实际上是用元素方法,属性,事件来操作HTML元素, 所以我们会认为大部分的时候我们操作的DOM节点都是HTML元素.

再次强调: HTML元素不等于HTML DOM节点, HTML元素只是HTML DOM节点中的其中一种, HTML元素也更不等于HTML DOM, HTML DOM是用来定义HTML文档中所有内容的一种规范. 注意是所有内容而不是单单代表HTML元素.

HTML DOM对象是什么?

我们打开: http://www.w3school.com.cn/jsref/index.asp

这个页面, 我们可以看到在左侧有个这一栏目.

下面4个子项.可以看出

HTML DOM对象一共包含:

1. DOM Document对象(文档对象)

2. DOM Element对象(元素对象)

3. DOM Attribute对象(属性对象)

4. DOM Event对象(事件对象)

上面4个图是w3c官方给的解释, 不难理解, 他所说的意思就是说这些对象是用来表示HTML DOM节点的. 分别对应文档节点, 元素节点, 属性节点以及元素的事件.

那么对象就很好理解了.就是另一种表现形式而已.DOM节点有的方法和属性他们都有.

但有个区别就是, 也是我之前遇到的坑.

Element对象和Attribute对象, 他们的关系是: 元素对象包含属性, 属性对象也包含属性.那么怎么区分呢.以我遇到的坑来说明一下.

<input name="username" value="tom" id="in" />

按照w3c的意思, input元素现在是input元素对象.

但input元素里的name啊, value这些属性是Attribute对象.

听起来有点绕.继续以代码来说

<script>
    document.username.name="123";
    // 这种方式获取到的是Attribute对象.

    var ele = document.getElementById("#in");
    // 而这种方式拿到的Element对象.
</script>

如果大家不能理解, 请运行一下这段代码.

在运行时候, 先把原来的123删掉, 输入一些别的东西.

然后单击按钮弹出2个提示框, 看一下前后2个值. 就知道两个值不一样了.

我的输出结果是:

Attribute对象访问value属性方式: 12312321321321

111.html:16 Element对象调用getAttribute()方法方式: 123

<form action="#" method="get" name="form">
    <input type="text" name="aa" value="123"/>
</form>
<button onclick="cc()">get value</button>
<script type="text/javascript">
    function cc() {
        alert("Attribute对象访问value属性方式: " + document.form.aa.value); // 这个会弹出你输入的值.
        alert("Element对象调用getAttribute()方法方式: " + document.form.aa.getAttribute("value")); // 而这个每次都弹出123.
    }
</script>   

因为一个拿到的是Element对象, 一个拿到的是Attribute对象.

2者区别是:

1. Attribute对象拿到的是内存中的数据.

2. Element对象拿到的是元素中的数据.

而元素中的数据是不会变的. 这点可以通过审查元素来看.

如图所示, 我在输入12312321321321之后, 元素里的123并没有改变.

现在我们知道区别了. 但我想大家可能还有个疑惑的地方, 那就是, 我怎么知道用Attribute对象的方式去访问属性?

在问这个问题之前, 先要知道Attribute对象里面都有哪些属性.

可以在http://www.w3school.com.cn/jsref/dom_obj_attributes.asp这里看到有以下这些属性.

那么怎么以属性的方式访问呢?

其实很简单, 看一下下面的代码.

var input = document.getElementBy("in");// 我们知道这个是拿到某个元素.

var value = input.value; // 这样写就是访问Attribute对象的方式去访问元素value属性.
var value1 = input.getAttribute("value"); // 而这样写是调用Input这个Element对象的方式去访问元素的属性.

// 以及在属性上面也是不一样的.
input.value = "al0n4k"; // 这样写是以Attribute对象的方式去设置属性.
input.setAttribute("value", "al0n4k"); // 这样就是用Element对象的方式去设置属性.

注意: 通过Element对象设置元素的属性时, 不会写到内存中, 这时候用Attribute对象方式访问属性是无法获取到修改后的值的. 在表单提交时, 这是一个坑. 如果要设置值, 用Attribute对象的方式去访问元素的属性然后设置值.



此文到此结束, 为了讲清楚我也是删删改改. 花了不少时间, 希望对大家有帮助. 共勉, cheers!

时间: 2024-10-12 10:14:57

HTML DOM基本概念及Element.getAttribute("value") 与Attribute.value差异的相关文章

57-4 数据库分片概念及mongodb sharding的实现

04 数据库分片的概念及mongodb sharding的实现 配置环境: node1: 192.168.1.121 CentOS release 6.7 node2: 192.168.1.122 CentOS release 6.7 node3: 192.168.1.123 CentOS release 6.7 [[email protected] ~]# vim /etc/hosts 添加 192.168.1.121   node1 192.168.1.122   node2 192.168

第五十一课 NoSQL基础概念及MongoDB应用、数据库分配概念

NoSQL基础概念及MongoDB MongoDB基础应用 MongoDB索引及复制集 数据库分片的概念及Mongodb  sharding的实现 一.NoSQL基础概念 NoSQL(Not Only SQL),是一种技术流派,非关系型数据库:适合用在大数据领域,各种nosql有各自的查询语句,这也是nosql的缺点之一. 大数据(BigDate)也称海量数据是一个模糊的概念,像Google.百度收集大量数据,分析现在.预测未来:这些数据通过某些特定的特征和算法得出某些预测的结果,这些数据为大数

正则表达式基本概念及在java中的使用

正则表达式,我是从why,what,how开始探索的... why:正则表达式用“俗语”解释是什么意思?“历史”上发生了什么事情,让正则表达式诞生了? what:正则表达式具体内容是什么?包含什么定义?这些定义分别用来做什么? how:我在用java,那么正则表达式和java又是怎么联系起来的呢? 伴随着这些问题的解决,对正则表达式有了初步的理解,习惯性用脑图将这些内容整理,希望和大家一起沟通,互相进步~ 正则表达式基本概念及在java中的使用,布布扣,bubuko.com

数据库基本概念及Oracle基本语句

一.数据库分类 通常是按照数据模型的特点将传统数据库系统分成网状数据库.层次数据库和关系数据库三种. 1.网状数据库 顾名思义,网状数据库采用的是以记录类型为结点的网状数据模型,是一种导航式(Navigation)的数据库--用户在操作数据库时不但要指明要访问的对象(数据),还要规定其存取路径. 网状数据库模型对于层次和非层次结构的信息都能比较自然的模拟,在关系数据库出现之前网状DBMS要比层次DBMS用得普遍.在数据库发展史上,网状数据库占有重要地位. 2.层次型数据库 紧随网络型数据库之后出

马哥教育第二十四ftp协议、vsftpd的高级应用、rpc概念及nfs的基本应用、samba及其基本应用

1.ftp协议及vsftpd的基本应用         文件共享服务:                 工作在应用层:ftp(file transfer protocol)                          应用层协议:tcp,                  工作在内核:nfs                 跨平台:samba           ftp工作在221号端口,传输数据:                  命令连接:文件管理类命令,始终在线的连接       

iOS开发多线程网络———多线程概念及GCD

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(htt

元素的属性相关操作element.getAttribute(&#39;xxx&#39;),element.setAttribute(&#39;xxx&#39;,&#39;xxx&#39;),element.removeAttribute(&#39;xxx&#39;)

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div id="demo" class="one" title="鼠标经过">&

javascript-DOM 基本概念及DOM节点

一:属性和方法 属性:是节点(HTML 元素)的值,您能够获取或设置(比如节点的名称或内容). 方法:是我们可以在节点(HTML 元素)上执行的动作.(比如添加或修改元素). 二:HTML DOM 定义: DOM(Document Object Model):文档模型, HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法. HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准. 在js中通过document这个对象提供的方法 三:HTML DOM 节

LVM逻辑卷基本概念及LVM的工作原理

这篇随笔将详细讲解Linux磁盘管理机制中的LVM逻辑卷的基本概念以及LVM的工作原理!!! 一.传统的磁盘管理 其实在Linux操作系统中,我们的磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进行文件系统的格式化,在Linux系统中如果要使用该分区就将其挂载上去即可,windows的话其实底层也就是自动将所有的分区挂载好,然后我们就可以对该分区进行使用了. 但是这种传统的磁盘管理经常会带来很