W3C DOM异常对象DOMException介绍
觉得这个分析比较靠谱:在使用jQuery的ajax且网络很慢、设置了timeout的情况下,直接不判断ajax的readyState而直接取responseText将出会错(此时xhr对象可能只有两个属性可用:responseXML、readyState)。
一、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错误的一个平台,收集各个同行的经验,造福自己以及其他同行;而不仅仅是个普通文章。想法是美好的,具体就要看您的贡献与支持了!一起努力吧!