dom-create-debug.js revision 76ca635d61eb3f9fb7c9d788a44fa8b1690aa138
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassvar re_tag = /<([a-z]+)/i,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!div.firstChild || div.firstChild.tagName !== tag.toUpperCase()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass frag = Y_DOM._fragClones[tag] = doc.createElement(tag);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Creates a new dom node using the provided markup string.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method create
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {String} html The markup used to create the element
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {HTMLDocument} doc An optional document context
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {HTMLElement|DocumentFragment} returns a single HTMLElement
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * when creating one node, and a documentFragment when creating
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * multiple nodes.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (m && m[1]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (nodes[0] && nodes[0].className === 'yui3-big-dummy') { // using dummy node to preserve some attributes (e.g. OPTION not selected)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else { // return multiple nodes as a fragment
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var ret = null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (nodes && (nodes.push || nodes.item) && nodes[0]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (nodes.item) { // convert live list to static array
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } // else inline with log for minification
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass else { Y.log('unable to convert ' + nodes + ' to fragment', 'warn', 'dom'); }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Inserts content in a node at the given location
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method addHTML
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {HTMLElement} node The node to insert into
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {HTMLElement | Array | HTMLCollection} content The content to be inserted
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {HTMLElement} where Where to insert the content
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * If no "where" is given, content is appended to the node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Possible values for "where"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>HTMLElement</dt>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dd>The element to insert before</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>"replace"</dt>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dd>Replaces the existing HTML</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>"before"</dt>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dd>Inserts before the existing HTML</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>"before"</dt>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dd>Inserts content before the node</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>"after"</dt>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dd>Inserts content after the node</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (content != undefined) { // not null or undefined (maybe 0)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (typeof content == 'string' || typeof content == 'number') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (content[0] && content[0].nodeType) { // array or collection
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newNode.appendChild(item); // append to fragment for insertion
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (where.nodeType) { // insert regardless of relationship to node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'replace':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (newNode) { // allow empty content to clear node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'before':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'after':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (node.nextSibling) { // IE errors if refNode is null
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass nodeParent.insertBefore(newNode, node.nextSibling);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (newNode) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass test: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } catch(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return (node.firstChild && node.firstChild.nodeName === 'TBODY');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass test: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass test: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return createFromDIV('<script></script>', 'script');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // TODO: thead/tfoot with nested tbody
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // IE adds TBODY when creating TABLE elements (which may share this impl)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var frag = Y_DOM.create(TABLE_OPEN + html + TABLE_CLOSE, doc),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass tb.parentNode.removeChild(tb); // strip extraneous tbody
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return Y_DOM.create('<select><option class="yui3-big-dummy" selected></option>' + html + '</select>', doc);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return Y_DOM.create('<tbody>' + html + '</tbody>', doc);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return Y_DOM.create('<tr>' + html + '</tr>', doc);