【问题标题】:Will document.createElement("") ever fail?document.createElement("") 会失败吗?
【发布时间】:2013-10-19 10:36:48
【问题描述】:

如果我在错误的网站上提问,请重新定位(基于 Javascript 的问题,所以我很确定它在正确的位置)。

我目前正在处理一个即将为客户完成和设置的项目的错误捕获。我想知道 Javascript 中的以下行是否会失败?

var element = document.createElement("someelement")

前提是:

  • someelement 是一个有效的 HTML 标签 (div, a, h1, etc)
  • element 可以是任何非保留字且以字母开头的字符串。
  • 运行它的设备是现代设备,RAM 不是问题

它会失败吗?如果是,它会返回什么?

注意:如果您有来源,那就太好了。

【问题讨论】:

  • 我想如果它不能分配所需的内存就会失败。
  • @Spudley 这也是我唯一能想到的。

标签: javascript error-handling


【解决方案1】:

http://www.w3.org/TR/DOM-Level-2-Core/core.html

 Element            createElement(in DOMString tagName)
                                        raises(DOMException);

Exceptions
DOMException

INVALID_CHARACTER_ERR: Raised if the specified name contains an illegal character.

无效字符例如空间:

document.createElement(" ")

http://jsfiddle.net/yRY6Q/

【讨论】:

    【解决方案2】:

    根据the spec,如果 tagName 包含无效字符(空白字符等),则会引发 DOMException。

    在 Firefox 中,document.creatElement 只会在传递无效字符时失败。 Null 或 undefined 都可以。

    在 Chrome 中,document.createElement 在传递 null 或无效字符时会失败并抛出 InvalidCharacterError。未定义是可以的。

    正如一些用户在 cmets 中指出的那样,由于内存资源等原因,它总是会失败,但你无法采取任何措施来防止这种情况发生。

    所以,如果someelement is a valid HTML tag (div, a, h1, etc),它永远不会失败。

    你可以使用这个sn-p来查找无效字符:

    for(var i = 0; i < 200; i++) {
        var chr = String.fromCharCode(i);
        var msg = i + ". " + chr + ": ";
    
        try {
            var elm = document.createElement(chr);
            msg += "OK";
        }
        catch(e)
        {
            msg += "FAIL";
        }
    
        console.log(msg);
    }
    

    【讨论】:

      【解决方案3】:

      我知道的唯一例外情况如下(注意我使用的是 Chrome):

      Error: InvalidCharacterError: DOM Exception 5
      

      当您将null、对象或数组作为参数传递时,会出现此异常。当您传递包含无效 HTML 字符的字符串(例如 @!#?)时,它也会失败。

      如果传入undefined,或者不指定参数,则会创建一个未定义的元素。

      <undefined></undefined>
      

      如果您确定此函数会引发错误,您可能应该在调用createElement 之前检查您传递的字符串是否为!== null,因为这可能是您的问题的根源。

      如果错误仍然存​​在,也许检查字符串是否仅包含字母 a-z、下划线和连字符。

      【讨论】:

      • 这是 chrome 的特性,因为 "null" 工作得很好,null 在 Firefox 中工作。