📄 html.js
字号:
if(!dojo._hasResource["dojox.dtl.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.dtl.html"] = true;dojo.provide("dojox.dtl.html");dojo.require("dojox.dtl._base");dojo.require("dojox.dtl.Context");(function(){ var dd = dojox.dtl; var ddt = dd.text; var ddh = dd.html = { types: dojo.mixin({change: -11, attr: -12, custom: -13, elem: 1, text: 3}, ddt.types), _attributes: {}, _re4: /^function anonymous\(\)\s*{\s*(.*)\s*}$/, getTemplate: function(text){ if(typeof this._commentable == "undefined"){ // Check to see if the browser can handle comments this._commentable = false; var div = document.createElement("div"); div.innerHTML = "<!--Test comment handling, and long comments, using comments whenever possible.-->"; if(div.childNodes.length && div.childNodes[0].nodeType == 8 && div.childNodes[0].data == "comment"){ this._commentable = true; } } if(!this._commentable){ // Strip comments text = text.replace(/<!--({({|%).*?(%|})})-->/g, "$1"); } var match; var pairs = [ [true, "select", "option"], [dojo.isSafari, "tr", "th"], [dojo.isSafari, "tr", "td"], [dojo.isSafari, "thead", "tr", "th"], [dojo.isSafari, "tbody", "tr", "td"] ]; // Some tags can't contain text. So we wrap the text in tags that they can have. for(var i = 0, pair; pair = pairs[i]; i++){ if(!pair[0]){ continue; } if(text.indexOf("<" + pair[1]) != -1){ var selectRe = new RegExp("<" + pair[1] + "[\\s\\S]*?>([\\s\\S]+?)</" + pair[1] + ">", "ig"); while(match = selectRe.exec(text)){ // Do it like this to make sure we don't double-wrap var found = false; var tokens = dojox.string.tokenize(match[1], new RegExp("(<" + pair[2] + "[\\s\\S]*?>[\\s\\S]*?</" + pair[2] + ">)", "ig"), function(child){ found = true; return {data: child}; }); if(found){ var replace = []; for(var j = 0; j < tokens.length; j++) { if(dojo.isObject(tokens[j])){ replace.push(tokens[j].data); }else{ var close = pair[pair.length - 1]; var k, replacement = ""; for(k = 2; k < pair.length - 1; k++){ replacement += "<" + pair[k] + ">"; } replacement += "<" + close + ' iscomment="true">' + dojo.trim(tokens[j]) + "</" + close + ">"; for(k = 2; k < pair.length - 1; k++){ replacement += "</" + pair[k] + ">"; } replace.push(replacement); } } text = text.replace(match[1], replace.join("")); } } } } var re = /\b([a-zA-Z]+)=['"]/g; while(match = re.exec(text)){ this._attributes[match[1].toLowerCase()] = true; } var div = document.createElement("div"); div.innerHTML = text; var output = {nodes: []}; while(div.childNodes.length){ output.nodes.push(div.removeChild(div.childNodes[0])) } return output; }, tokenize: function(/*Node*/ nodes){ var tokens = []; for(var i = 0, node; node = nodes[i++];){ if(node.nodeType != 1){ this.__tokenize(node, tokens); }else{ this._tokenize(node, tokens); } } return tokens; }, _swallowed: [], _tokenize: function(/*Node*/ node, /*Array*/ tokens){ var types = this.types; var first = false; var swallowed = this._swallowed; var i, j, tag, child; if(!tokens.first){ // Try to efficiently associate tags that use an attribute to // remove the node from DOM (eg dojoType) so that we can efficiently // locate them later in the tokenizing. first = tokens.first = true; var tags = dd.register.getAttributeTags(); for(i = 0; tag = tags[i]; i++){ try{ (tag[2])({ swallowNode: function(){ throw 1; }}, ""); }catch(e){ swallowed.push(tag); } } } for(i = 0; tag = swallowed[i]; i++){ var text = node.getAttribute(tag[0]); if(text){ var swallowed = false; var custom = (tag[2])({ swallowNode: function(){ swallowed = true; return node; }}, text); if(swallowed){ if(node.parentNode && node.parentNode.removeChild){ node.parentNode.removeChild(node); } tokens.push([types.custom, custom]); return; } } } var children = []; if(dojo.isIE && node.tagName == "SCRIPT"){ children.push({ nodeType: 3, data: node.text }); node.text = ""; }else{ for(i = 0; child = node.childNodes[i]; i++){ children.push(child); } } tokens.push([types.elem, node]); var change = false; if(children.length){ // Only do a change request if we need to tokens.push([types.change, node]); change = true; } for(var key in this._attributes){ var value = ""; if(key == "class"){ value = node.className || value; }else if(key == "for"){ value = node.htmlFor || value; }else if(key == "value" && node.value == node.innerHTML){ // Sometimes .value is set the same as the contents of the item (button) continue; }else if(node.getAttribute){ value = node.getAttribute(key, 2) || value; if(key == "href" || key == "src"){ if(dojo.isIE){ var hash = location.href.lastIndexOf(location.hash); var href = location.href.substring(0, hash).split("/"); href.pop(); href = href.join("/") + "/"; if(value.indexOf(href) == 0){ value = value.replace(href, ""); } value = decodeURIComponent(value); } if(value.indexOf("{%") != -1 || value.indexOf("{{") != -1){ node.setAttribute(key, ""); } } } if(typeof value == "function"){ value = value.toString().replace(this._re4, "$1"); } if(!change){ // Only do a change request if we need to tokens.push([types.change, node]); change = true; } // We'll have to resolve attributes during parsing tokens.push([types.attr, node, key, value]); } for(i = 0, child; child = children[i]; i++){ if(child.nodeType == 1 && child.getAttribute("iscomment")){ child.parentNode.removeChild(child); child = { nodeType: 8, data: child.innerHTML }; } this.__tokenize(child, tokens); } if(!first && node.parentNode && node.parentNode.tagName){ if(change){ tokens.push([types.change, node, true]); } tokens.push([types.change, node.parentNode]); node.parentNode.removeChild(node); }else{ // If this node is parentless, it's a base node, so we have to "up" change to itself // and note that it's a top-level to watch for errors tokens.push([types.change, node, true, true]); } }, __tokenize: function(child, tokens){ var types = this.types; var data = child.data; switch(child.nodeType){ case 1: this._tokenize(child, tokens); return; case 3: if(data.match(/[^\s\n]/) && (data.indexOf("{{") != -1 || data.indexOf("{%") != -1)){ var texts = ddt.tokenize(data); for(var j = 0, text; text = texts[j]; j++){ if(typeof text == "string"){ tokens.push([types.text, text]); }else{ tokens.push(text); } } }else{ tokens.push([child.nodeType, child]); } if(child.parentNode) child.parentNode.removeChild(child); return; case 8: if(data.indexOf("{%") == 0){ var text = dojo.trim(data.slice(2, -2)); if(text.substr(0, 5) == "load "){ var parts = dd.text.pySplit(dojo.trim(text)); for(var i = 1, part; part = parts[i]; i++){ dojo["require"](part); } } tokens.push([types.tag, text]); } if(data.indexOf("{{") == 0){ tokens.push([types.varr, dojo.trim(data.slice(2, -2))]); } if(child.parentNode) child.parentNode.removeChild(child); return; } } }; dd.HtmlTemplate = dojo.extend(function(/*String|DOMNode|dojo._Url*/ obj){ // summary: Use this object for HTML templating if(!obj.nodes){ var node = dojo.byId(obj); if(node){ dojo.forEach(["class", "src", "href", "name", "value"], function(item){ ddh._attributes[item] = true; }); obj = { nodes: [node] }; }else{ if(typeof obj == "object"){ obj = ddt.getTemplateString(obj); } obj = ddh.getTemplate(obj); } } var tokens = ddh.tokenize(obj.nodes); if(dd.tests){ this.tokens = tokens.slice(0); } var parser = new dd._HtmlParser(tokens); this.nodelist = parser.parse(); }, { _count: 0, _re: /\bdojo:([a-zA-Z0-9_]+)\b/g, setClass: function(str){ this.getRootNode().className = str; }, getRootNode: function(){ return this.rootNode; }, getBuffer: function(){ return new dd.HtmlBuffer(); }, render: function(context, buffer){ buffer = buffer || this.getBuffer(); this.rootNode = null; var output = this.nodelist.render(context || new dd.Context({}), buffer); this.rootNode = buffer.getRootNode(); for(var i = 0, node; node = buffer._cache[i]; i++){ if(node._cache){ node._cache.length = 0; } } return output; }, unrender: function(context, buffer){ return this.nodelist.unrender(context, buffer); } }); dd.HtmlBuffer = dojo.extend(function(/*Node*/ parent){ // summary: Allows the manipulation of DOM // description: // Use this to append a child, change the parent, or // change the attribute of the current node. this._parent = parent; this._cache = []; }, { concat: function(/*DOMNode*/ node){ var parent = this._parent; if(node.parentNode && node.parentNode.tagName && parent && !parent._dirty){ return this; } if(node.nodeType == 1 && !this.rootNode){ this.rootNode = node || true; } if(!parent){ if(node.nodeType == 3 && dojo.trim(node.data)){ throw new Error("Text should not exist outside of the root node in template"); } return this; } if(this._closed && (node.nodeType != 3 || dojo.trim(node.data))){ throw new Error("Content should not exist outside of the root node in template"); } if(parent._dirty){ if(node._drawn && node.parentNode == parent){ var caches = parent._cache; if(caches){ for(var i = 0, cache; cache = caches[i]; i++){ this.onAddNode(cache); parent.insertBefore(cache, node); this.onAddNodeComplete(cache); } caches.length = 0; } } parent._dirty = false; } if(!parent._cache){ parent._cache = []; this._cache.push(parent); } parent._dirty = true; parent._cache.push(node); return this; }, remove: function(obj){ if(typeof obj == "string"){ if(this._parent){ this._parent.removeAttribute(obj); } }else{ if(obj.nodeType == 1 && !this.getRootNode() && !this._removed){ this._removed = true; return this; } if(obj.parentNode){ this.onRemoveNode(); if(obj.parentNode){ obj.parentNode.removeChild(obj); } } } return this; }, setAttribute: function(key, value){ if(key == "class"){ this._parent.className = value; }else if(key == "for"){ this._parent.htmlFor = value; }else if(this._parent.setAttribute){ this._parent.setAttribute(key, value); } return this; }, addEvent: function(context, type, fn, /*Array|Function*/ args){ if(!context.getThis()){ throw new Error("You must use Context.setObject(instance)"); } this.onAddEvent(this.getParent(), type, fn); var resolved = fn; if(dojo.isArray(args)){ resolved = function(e){ this[fn].apply(this, [e].concat(args)); } } return dojo.connect(this.getParent(), type, context.getThis(), resolved);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -