首页 > 建站教程 > JS、jQ、TS >  W3C DOM异常对象DOMException介绍,Uncaught Error: NOT_FOUND_ERR: DOM正文

W3C DOM异常对象DOMException介绍,Uncaught Error: NOT_FOUND_ERR: DOM

一、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属性上使用getFloatValueCSSPrimitiveValue方法。

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

四、最后的说明

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

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

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

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