惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - dail

IE浏览器在虚拟机中无法正常显示字符 jQuery在updatepanel中使用造成内存泄露 在使用jQuery的时候不小心的内存泄漏 jQuery 1.7的隐藏改动 jQuery 1.6的变化 - dail jQuery ui effects - dail jQuery ui 1.8.6 position 的一个bug - dail 一个progressbar widget jQuery编写widget的一些窍门 jquery animate动画的特殊用法。 一个简单的widget Jquery ui widget中的_create(),_init(),destroy() Jquery ui widget开发 Jquery ui css framework jquery animate Json.net简单用法 EXTJS学习(二)Message EXTJS学习(一) - dail jquery+linq制作博客(二)
在javascript中实现类似asp.net webcontrol中的render的方法
dail · 2011-07-21 · via 博客园 - dail

在asp.net中的webcontrol开发的时候采用render方法来呈现控件。在javascript中,对于一些html代码的拼接大多数情况下采用字符串相加的方式来处理,这样做有以下弊端:

1.可读性差,易出错,出错后不易发现。

2.在javascript最小化的时候,长长的字符串不能最下化。

于是在项目中我实现了累死render的方法来处理html代码的拼接。

StringBuilder = function () {
		var self = this,
			strs = [];

		self.append = function (str) {
			strs.push(str);
		};

		self.toString = function () {
			return strs.join("");
		};

		self.dispose = function () {
			strs = null;
		};
	},

	TextElement = function (text) {
		this.text = text;

		this.render = function () {
			return this.text;
		};
	},

	HtmlElement = function (tagName, innerText, attributes) {
		var self = this,
			halfTags = { br: true, img: true, hr: true, input: true };

		self.tagName = tagName || "div";
		self.attributes = attributes || {};
		self.innerText = innerText || "";
		self.children = [];

		if ($.isPlainObject(innerText)) {
			self.innerText = "";
			self.attributes = innerText;
		}

		self._isShortTag = false;

		if (halfTags[self.tagName] === true) {
			self._isShortTag = true;
		}

		self.render = function () {
			var sb = new StringBuilder(),
				html = "";

			sb.append(self._renderBeginTag(self.tagName, self.attributes));
			if (self.innerText !== "") {
				sb.append(self.innerText);
			}

			if (self.children.length > 0) {
				$.each(self.children, function (index, ele) {
					sb.append(ele.render());
				});
			}

			sb.append(self._renderEndTag(self.tagName));
			html = sb.toString();
			sb.dispose();

			return html;
		};

		self.add = function (ele) {
			this.children.push(ele);
		};

		self._renderBeginTag = function (tagName, attributes) {
			var sb = new StringBuilder(),
				strRet = "";
			sb.append("<");
			sb.append(tagName);
			$.each(attributes, function (key, value) {
				sb.append(" ");
				sb.append(key);
				sb.append("=");
				sb.append("\"");
				sb.append(value.toString());
				sb.append("\"");
			});

			if (this._isShortTag) {
				sb.append(" ");
			} else {
				sb.append(">");
			}

			strRet = sb.toString();
			sb.dispose();

			return strRet;
		};

		self._renderEndTag = function (tagName) {
			var sb = new StringBuilder(),
				strRet = "";

			if (this._isShortTag) {
				sb.append("/>");
			} else {
				sb.append("</");
				sb.append(tagName);
				sb.append(">");
			}
			strRet = sb.toString();
			sb.dispose();
			return strRet;
		};
	};

最上面上在javascript中实现了一个stringBuilder类。处理字符串拼接的。用户用的时候采用下面的方法来调用HtmlElement这个类

var div = new HtmlElement("div", {class:"divcss"});
var innertextbox = new HtmlElement("input", {type:"text"});
div.add(innertextbox);
var str =  div.render();

str得到的结果是

<div class="divcss">
<input type="text" />
</div>

在使用的时候可以将创建textbox以及一些常用的html element封装成方法,这样就能提高代码的重用性,减少代码体积,也便于维护。