1. 程式人生 > >js動態新增任何html標籤

js動態新增任何html標籤

程式設計思路: 

我認為, 對於html標籤來說, 分為閉合和半閉合兩種, 

當我用js創造一大片html程式碼的時候, 會容易出現很雜亂的觀感,而且並不容易維護. 

那麼我將建立閉合和半閉合標籤作為兩個方法, 每次建立就呼叫一次, 返回字串型別的HTML程式碼,

然後用$....append() 或者 DOM的innerHTML加入就可以

建議: 配合JQuery食用更佳, 當然document.....innerHTML也可以.

格式示例: 

    let create = new CreateNode();                            // 必須的

    let code = create. packageNode("div", {

            // 你可以在這裡加上所有你喜歡的屬性節點,

            // 但請要注意的是, content屬性是用來生成閉合標籤內部內容的, 所以這點要留意

            // 另外, 由於packageNode 和 halfPackageNode都只是返回字串, 那麼你可以在content裡巢狀你的其他標籤

            class: 'div-class',            

            id: 'wokao',

            content: '包含的內容' + create.packageNode("div", {

                     content: "內容2"  

             })

})

$("body").append(code)        // 新增到html文件

使用方法 和 引數解釋:

 let create = new CreateNode();     // 必須, 第一步

create.packageNode( ['標籤名'], ['屬性名(content屬性是閉合標籤內的內容)'] )         // 建立閉合標籤

create.halfPackageNode( ['標籤名'], ['屬性名(請不要填寫content屬性, 填寫了也沒用)'] )         // 建立半閉合標籤

實現程式碼:

// 建立元素節點
// :method halfPackageNode: 建立半閉合節點
// :method PackageNode: 建立閉合節點
function CreateNodes() {
    if (!this instanceof CreateNodes) return new CreateNodes();

    // 建立半閉合節點
    // :param nodeName: [String] 節點名稱
    // :param obj: [Object] 屬性集合
    // :return [String] 返回對應的HTML程式碼
    this.halfPackageNode = function (nodeName, obj) {
        // 資料檢查
        if (typeof nodeName !== 'string') return false;
        let objType = Object.prototype.toString.call(obj).slice(8, -1);
        if (objType !== 'Object') return false;

        // 組裝屬性
        let property = '';
        for (let i in obj) {
            if (Object.prototype.toString.call(obj[i]).slice(8, -1) === 'Function') {
                obj[i] = obj[i]();
                !obj[i] && (obj[i] = '');
            }
            property += (" " + i + "='" + obj[i] + "'");
        }

        // 返回html程式碼
        return "<" + nodeName + property + " />";
    };

    // 建立閉合節點
    // :param nodeName: [String] 節點名稱
    // :param obj: [Object/String] 屬性集合(content屬性是節點內容,如果是字串,那麼直接加入節點內)
    this.packageNode = function (nodeName, obj) {
        // 資料檢查
        if (typeof nodeName !== 'string') return false;
        let objType = Object.prototype.toString.call(obj).slice(8, -1);
        if (objType === 'Array' || objType === 'Function') return false;

        // 組裝程式碼
        let property = '', content = '';
        if (objType === 'String') content = obj;
        else {
            let i = 0, key = Object.keys(obj), len = key.length;
            for (; i < len; i++) {
                // 如果物件屬性值是一個函式, 那麼執行函式
                if (Object.prototype.toString.call(obj[key[i]]) === '[object Function]') {
                    obj[key[i]] = obj[key[i]]();
                    !obj[key[i]] && (obj[key[i]] = '');
                }

                // 如果物件擁有"content"屬性, 把值抽出來,並刪除其屬性
                if (key[i] === 'content') {
                    content = obj['content'];
                    continue;
                }

                // 組裝節點屬性
                property += " " + key[i] + "='" + obj[key[i]] + "'";
            }

        }
        return "<" + nodeName + property + ">" + content + "</" + nodeName + ">";
    };
}