自定义createElement——根据html字符串创建元素
2014-03-02 22:01
441 查看
转自:/article/3928845.html
zCool工具箱新增工具——createElement方法。
用法:根据(HTML)字符串参数创建一个元素。
示例:
Js代码
createElement('div');//这个当然是调用内置方法了
createElement('<tbody><tr><td></td></tr><tr></tbody>');
createElement('<img src="***" name="***" />');
createElement('<br>');
你可以回想一下,特别是用insertRow/insertCell这些传统方法为表格创建添加元素有多痛苦
源码实现:
Js代码
/**
* @author zbm2001 宝儿
*/
createElement = function(sHtml){
// 创建一个可复用的包装元素
var recycled = document.createElement('div'),
// 创建标签简易匹配
reg = /^<([a-zA-Z]+)(?=\s|\/>|>)[\s\S]*>$/,
// 某些元素HTML标签必须插入特定的父标签内,才能产生合法元素
// 另规避:ie7-某些元素innerHTML只读
// 创建这些需要包装的父标签hash
hash = {
'colgroup': 'table',
'col': 'colgroup',
'thead': 'table',
'tfoot': 'table',
'tbody': 'table',
'tr': 'tbody',
'th': 'tr',
'td': 'tr',
'optgroup': 'select',
'option': 'optgroup',
'legend': 'fieldset'
};
// 闭包重载方法(预定义变量避免重复创建,调用执行更快,成员私有化)
createElement = function(sHtml){
// 若不包含标签,调用内置方法创建并返回元素
if (!reg.test(sHtml)) {
return document.createElement(sHtml);
}
// hash中是否包含匹配的标签名
var tagName = hash[RegExp.$1.toLowerCase()];
// 若无,向包装元素innerHTML,创建/截取并返回元素
if (!tagName) {
recycled.innerHTML = sHtml;
return recycled.removeChild(recycled.firstChild);
}
// 若匹配hash标签,迭代包装父标签,并保存迭代层次
var deep = 0, element = recycled;
do {
sHtml = '<' + tagName + '>' + sHtml + '</' + tagName + '>';
deep++;
}
while (tagName = hash[tagName]);
element.innerHTML = sHtml;
// 根据迭代层次截取被包装的子元素
do {
element = element.removeChild(element.firstChild);
}
while (--deep > -1);
// 最终返回需要创建的元素
return element;
}
// 执行方法并返回结果
return createElement(sHtml);
}
评论
3 楼 zbm2001 2009-11-05
楼上提醒的没错,代码片段是从脚本库里截取的方法成员,
想修改成可以独立调用的方法,刚刚编辑漏了,已修改。
2 楼 lifesinger 2009-11-05
代码组织上,好像少了一句 this.createElement = createElement:
<code>
createElement: function(sHtml) {
// ...
var createElement = function(sHtml) {
// ...
};
this.createElement = createElement;
return createElement(sHtml);
}
</code>
1 楼 lifesinger 2009-11-05
很不错
zCool工具箱新增工具——createElement方法。
用法:根据(HTML)字符串参数创建一个元素。
示例:
Js代码
createElement('div');//这个当然是调用内置方法了
createElement('<tbody><tr><td></td></tr><tr></tbody>');
createElement('<img src="***" name="***" />');
createElement('<br>');
你可以回想一下,特别是用insertRow/insertCell这些传统方法为表格创建添加元素有多痛苦
源码实现:
Js代码
/**
* @author zbm2001 宝儿
*/
createElement = function(sHtml){
// 创建一个可复用的包装元素
var recycled = document.createElement('div'),
// 创建标签简易匹配
reg = /^<([a-zA-Z]+)(?=\s|\/>|>)[\s\S]*>$/,
// 某些元素HTML标签必须插入特定的父标签内,才能产生合法元素
// 另规避:ie7-某些元素innerHTML只读
// 创建这些需要包装的父标签hash
hash = {
'colgroup': 'table',
'col': 'colgroup',
'thead': 'table',
'tfoot': 'table',
'tbody': 'table',
'tr': 'tbody',
'th': 'tr',
'td': 'tr',
'optgroup': 'select',
'option': 'optgroup',
'legend': 'fieldset'
};
// 闭包重载方法(预定义变量避免重复创建,调用执行更快,成员私有化)
createElement = function(sHtml){
// 若不包含标签,调用内置方法创建并返回元素
if (!reg.test(sHtml)) {
return document.createElement(sHtml);
}
// hash中是否包含匹配的标签名
var tagName = hash[RegExp.$1.toLowerCase()];
// 若无,向包装元素innerHTML,创建/截取并返回元素
if (!tagName) {
recycled.innerHTML = sHtml;
return recycled.removeChild(recycled.firstChild);
}
// 若匹配hash标签,迭代包装父标签,并保存迭代层次
var deep = 0, element = recycled;
do {
sHtml = '<' + tagName + '>' + sHtml + '</' + tagName + '>';
deep++;
}
while (tagName = hash[tagName]);
element.innerHTML = sHtml;
// 根据迭代层次截取被包装的子元素
do {
element = element.removeChild(element.firstChild);
}
while (--deep > -1);
// 最终返回需要创建的元素
return element;
}
// 执行方法并返回结果
return createElement(sHtml);
}
评论
3 楼 zbm2001 2009-11-05
楼上提醒的没错,代码片段是从脚本库里截取的方法成员,
想修改成可以独立调用的方法,刚刚编辑漏了,已修改。
2 楼 lifesinger 2009-11-05
代码组织上,好像少了一句 this.createElement = createElement:
<code>
createElement: function(sHtml) {
// ...
var createElement = function(sHtml) {
// ...
};
this.createElement = createElement;
return createElement(sHtml);
}
</code>
1 楼 lifesinger 2009-11-05
很不错
相关文章推荐
- createElement 创建 HTML 元素
- 在js中使用createElement创建HTML对象和元素
- 在js中使用createElement创建HTML对象和元素
- 在js中使用createElement创建HTML对象和元素 (转)
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- 在js中使用createElement创建HTML对象和元素
- 在js中使用createElement创建HTML对象和元素
- 在js中使用createElement创建HTML对象和元素
- 创建html文档——html的文档元素和元数据元素
- 动态的创建一个元素createElement及删除一个元素
- 完成DELPHI的不可能功能:宏替换!(如何根据字符串来创建对象)
- createElement 创建DOM元素
- C#如何根据字符串动态的创建对象(类)?
- js根据类名获取元素——自定义getElementsByClass()
- easyui datagrid 自定义editor并根据实际情况(自定义options)判断返回多样的html控件
- 数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些
- 1.编写一个程序,这个程序把一个整数数组中的每个元素用逗号连接成一个字符串,例如,根据内容为[1][2][3]的数组形成内容
- HTML 自定义元素教程
- iOS 根据字符串数目,自定义Label等控件的高度