本文内容整理参考自:SitePoint > Reference > JAVASCRIPT > DOM Core > DOMException

一、DOMException是?

DOMException是W3C DOM核心对象。DOMException接口表示一个处理的错误,当一个操作不可能执行的时候,会抛出一个异常。例如试图创建一个无效的DOM, 或通过一个不存在的节点作为参数节点操作方法。

举个板栗,如下代码:
var node = document.getElementsByTagName('h1').item(0);
var refnode = node.nextSibling;
var newnode = document.createTextNode('这就是为何你挂了!');
node.insertBefore(newnode, refnode);

上面代码演示了一个会嗝屁的insertBefore操作,因为refnode不是一个子节点。在Opera浏览器下,上面的操作就会导致下面显示的异常错误:

Inline script thread
Error:
Unhandled Exception: [Object DOMException]
code: 8
message: NOT_FOUND_ERR

DOM并不对每个可能发生的错误定义一个异常,例如参数、语法错误就不在其中,这种情况有其自己的一套错误报告机制来处理。

实际上,大多数浏览器已经把DOM异常作为本地机制。除了显示异常代码和信息外,还显示了浏览器可以提供的其他信息(如行数或堆栈轨迹)

二、DOM Exceptions兼容性

兼容性见下表:

Internet Explorer Firefox Safari Opera
5.5 6.0 7.0 1.5 2.0 3.0 1.3 2.0 3.0 9.0 9.5
W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍 W3C DOM异常对象DOMException介绍

上表的兼容性数据还是比较老的,按照常规,IE9也应该支持的,最新的Chrome浏览器一定支持。

考古价值的IE浏览器不支持该接口,他们使用本地错误(解析错误之类)。例如,上面插入节点的例子,在老IE下抛出的就是:Invalid argument. 在XML中,会给出更多的信息:Insert position Node must be a Child of the Node to insert under.

三、常量列表

该接口定义了ExceptionCode整数值——向外暴露code属性——指向每种类型的错误;这些定义参考下面些常量:

INDEX_SIZE_ERR code 1
如果索引是负值,或是超过了允许值。例如splitText的offset参数比字符串长度还要长。
DOMSTRING_SIZE_ERR code 2
DOMString的特定字符数据太大。其大小显示是依赖实现的,未被DOM定义(每个浏览器的限制细节参见DOM Core)。
HIERARCHY_REQUEST_ERR code 3
节点不允许有新的子节点,或者新节点已经是其该节点的祖先节点。例如,尝试将Element节点塞入Text节点。
WRONG_DOCUMENT_ERR code 4
试图使用跨文档的节点操作。例如,appendChild的子节点来自其他文档。而不是先输出(使用importNode)。
INVALID_CHARACTER_ERR code 5
一个非法的或无效的字符指定一个有限制的字符串,例如元素的name.
NO_DATA_ALLOWED_ERR code 6
为不支持数据的节点指定数据。如Element节点本身不包含数据,其子节点包含。
NO_MODIFICATION_ALLOWED_ERR code 7
试图修改一个不能被修改的节点。例如,装载一个只读的节点。
NOT_FOUND_ERR code 8
引用的节点不存在。例如,insertBefore相关子节点不是引用的子节点。
NOT_SUPPORTED_ERR code 9
实现不支持的特定操作。例如使用一个节点的方法,但是此方法并没有实现,就是抛出此错误。
INUSE_ATTRIBUTE_ERR code 10
试图添加一个正在使用的属性。例如使用setAttributeNode引用一个已经在另一个元素使用的Attr, 而不是克隆它首先(使用cloneNode)。
INVALID_STATE_ERR code 11
试图使用一个不可用的对象。这种错误的抛出通常是因为某些内部原因,方法无法实现特定的操作。
SYNTAX_ERR code 12
无效或非法的字符串被指定。例如,用无效的CSS值设置selectorText属性的CSSStyleRule//zxx: 我遇到该错误是因为在特定情况下,对<title>标签使用了innerHTML方法。
INVALID_MODIFICATION_ERR code 13
尝试修改一个节点的类型。例如,使用不匹配最初规则类型的值设置cssText属性的CSSRule.(如,为at-rule设置style-rule values值).
NAMESPACE_ERR code 14
操作与命名空间冲突。例如createElementNS使用的名称歪瓜裂枣。
INVALID_ACCESS_ERR code 15
一个属性或操作不支持指定的节点。例如,尝试在一个不含float值的CSS属性上使用getFloatValueCSSPrimitiveValue方法。

关于code:ExceptionCode(也就是上面列表中一而再再而三的code)的整数值表示DOMException的类型。

四、最后的说明

W3C DOM异常对象DOMException介绍本文内容没什么看头。重要的记住这里有篇关于DOMException的文章即可,回头可以迅速找到就OK啦!上面展示的列表中对ExceptionCode不同值的解释太泛太笼统了,后面的举例感觉是要故意展示一些方法,属性等。因此,离自己所希望的人人进来,人人都有启发的愿景还是有一定差距的。DOMException的各个错误也是不容易碰到的,但是,一旦碰到是很头疼的,整个页面的JS基本上就会报废,而且,错误不易查找。例如,使用数字作为元素id,在某些特定情况下,某些浏览器下,就会报DOMException的错误。

我现在比以前懒的,要是过去,刚毕业那会,激情无限的时候,估计会废寝忘食把每个错误都呈现一遍。现在嘛,唉,搞不动了,而且,错误呈现实在不易。因此,抱歉,大家只能将就上面一些笼统泛泛的解释了吧。

不过嘛,团结才是力量,本文可以无限评论的。因此,您要是遇到DOMException错误,并因为这里或那里解决了,记得一定要把您遇到的错误code、具体情境以及解决方法。以评论或邮件(zhangxinxu@zhangxinxu.com)的形式告知,我一定会整理出现,放在正文中的。这样,集思广益,细流成海,以后,一旦遇到浏览器报DOMException的错误,来这里就可以搞定,岂不很好。

因此,希望本文可以成为一个解决DOMException错误的一个平台,收集各个同行的经验,造福自己以及其他同行;而不仅仅是个普通文章。想法是美好的,具体就要看您的贡献与支持了!一起努力吧!

相关文章: