一、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 |
上表的兼容性数据还是比较老的,按照常规,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属性上使用
getFloatValue
的CSSPrimitiveValue
方法。
关于code:ExceptionCode(也就是上面列表中一而再再而三的code)的整数值表示DOMException的类型。
四、最后的说明
本文内容没什么看头。重要的记住这里有篇关于DOMException
的文章即可,回头可以迅速找到就OK啦!上面展示的列表中对ExceptionCode不同值的解释太泛太笼统了,后面的举例感觉是要故意展示一些方法,属性等。因此,离自己所希望的人人进来,人人都有启发的愿景还是有一定差距的。DOMException的各个错误也是不容易碰到的,但是,一旦碰到是很头疼的,整个页面的JS基本上就会报废,而且,错误不易查找。例如,使用数字作为元素id
,在某些特定情况下,某些浏览器下,就会报DOMException的错误。
我现在比以前懒的,要是过去,刚毕业那会,激情无限的时候,估计会废寝忘食把每个错误都呈现一遍。现在嘛,唉,搞不动了,而且,错误呈现实在不易。因此,抱歉,大家只能将就上面一些笼统泛泛的解释了吧。
不过嘛,团结才是力量,本文可以无限评论的。因此,您要是遇到DOMException错误,并因为这里或那里解决了,记得一定要把您遇到的错误code、具体情境以及解决方法。以评论或邮件(zhangxinxu@zhangxinxu.com)的形式告知,我一定会整理出现,放在正文中的。这样,集思广益,细流成海,以后,一旦遇到浏览器报DOMException的错误,来这里就可以搞定,岂不很好。
因此,希望本文可以成为一个解决DOMException错误的一个平台,收集各个同行的经验,造福自己以及其他同行;而不仅仅是个普通文章。想法是美好的,具体就要看您的贡献与支持了!一起努力吧!