HTML = {}; HTML.isNully = function (node) { if (node == null) // null or undefined return true; if (node instanceof Array) { // is it an empty array or an array of all nully items? for (var i = 0; i < node.length; i++) if (! HTML.isNully(node[i])) return false; return true; } return false; }; HTML.escapeData = function (str) { // string; escape the two special chars in HTML data and RCDATA return str.replace(/&/g, '&').replace(/`), while // `setAttribute` seems to use something like the XML grammar for names (and // throws an error if a name is invalid, making that attribute unsettable). // If we knew exactly what grammar browsers used for `setAttribute`, we could // include various Unicode ranges in what's legal. For now, allow ASCII chars // that are known to be valid XML, valid HTML, and settable via `setAttribute`: // // * Starts with `:`, `_`, `A-Z` or `a-z` // * Consists of any of those plus `-`, `.`, and `0-9`. // // See and // . HTML.isValidAttributeName = function (name) { return /^[:_A-Za-z][:_A-Za-z0-9.\-]*/.test(name); };