`
zbm2001
  • 浏览: 16486 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

自定义createElement——根据html字符串创建元素

阅读更多
zCool工具箱新增工具——createElement方法。

用法:根据(HTML)字符串参数创建一个元素。

示例:
createElement('div');//这个当然是调用内置方法了
createElement('<tbody><tr><td></td></tr><tr></tbody>');
createElement('<img src="***" name="***" />');
createElement('<br>');

你可以回想一下,特别是用insertRow/insertCell这些传统方法为表格创建添加元素有多痛苦

源码实现:
/**
 * @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  
很不错

相关推荐

    js autocomplete实现下拉模糊查询

    这通常涉及字符串的模糊匹配算法,如Levenshtein距离、部分匹配或简单的包含检查。对于简单实现,可以使用JavaScript的`Array.filter`方法: ```javascript function filterData(inputValue, data) { return data....

    C#简单操作XML完整示例源码_《0528》.rar

    另外,XmlSerializer类可以自动将类实例转换为XML字符串,反之亦然,这对于数据持久化非常有用。 ```csharp public class Book { public string Title { get; set; } } [XmlRoot("Book")] public class BookXml {...

    JS随手记——商城购物车的分析与实现

    当购物车页面加载时,我们需要遍历所有已存储的商品ID,并根据这些ID从数据源(例如数组或API)获取商品信息,然后动态创建HTML元素展示在页面上。以下代码演示了如何使用循环检查Cookie并生成购物车表格: ```...

    javascript弹出带文字信息的提示框效果

    如果需要更复杂的提示框效果,我们可以创建自定义的HTML元素来模拟这个功能。在给出的部分代码中,可以看到一个名为`tooltips.js`的脚本,它创建了一个动态定位的提示框。 1. **创建新元素**:在`newelement`函数中...

    Web Calendar ver 3.0 网页日历控件!

    3. **日期和时间处理**:`datatime.js` 可能包含了对日期和时间的处理函数,如计算月份天数、判断是否闰年、格式化日期字符串等。这些功能可能基于JavaScript内置的`Date`对象进行扩展。 4. **用户交互**:控件支持...

    ie9不支持ext对象的问题

    这个方法用于将HTML字符串转换为文档片段,这对于动态创建DOM元素非常有用。 ```javascript if((typeof Range !== "undefined") && !Range.prototype.createContextualFragment) { Range.prototype....

    JavaScript快速检测浏览器对CSS3特性的支持情况

    此外,由于它依赖于特性检测而非用户代理(UA)字符串,其结果更为可靠。 然而,使用UA字符串进行检测也是一种常见的做法。通过分析浏览器发送的UA信息,可以推断出浏览器的类型和版本,进而判断是否支持特定的CSS3...

    js简单的表格添加行和删除行操作示例

    代码定义了一个自定义函数$c(),它利用document的createElement方法创建一个新的HTML元素。 ```javascript function $c(tagname) { return document.createElement(tagname); } ``` ### 知识点三:使用jQuery绑定...

    PlatziWeather:网页设计实践

    在读取本地存储的城市数据时,我们需要确保从JSON格式中解析出的时间字符串能够转换为Date对象,然后可以使用`toLocaleString()`方法或自定义格式化函数来展示用户友好的时间。此外,确保在保存数据时,时间信息是以...

Global site tag (gtag.js) - Google Analytics