成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

擴展原生appendChild方法

kk_miles / 1326人閱讀

摘要:源代碼把類數(shù)組對象轉(zhuǎn)換為數(shù)組。節(jié)點對象返回被替代的節(jié)點對象節(jié)點對象被替代成可以運行的如果是節(jié)點對象,則替代為可運行的節(jié)點對象遞歸字符串轉(zhuǎn)成文檔片段節(jié)點對象。返回文檔片段節(jié)點對象用于擴展方法。

Node.prototype.appendChildPlus()

寫于:2017-1-2 | 更新于:2017-1-3

概述

appendChild方法的缺點有兩個:

不能傳多個參數(shù)

參數(shù)只能是節(jié)點對象

這里給Node.prototype添加一個方法,名稱為:appendChildPlus,可以認為是appendChild的加強版,特點如下:

參數(shù)可以是html字符串和節(jié)點對象

可以傳多個參數(shù)

script標簽字符串和新建的script節(jié)點對象插入文檔以后可以正常運行

所有參數(shù)是一起插入指定節(jié)點的,而不是一個一個插入。

源代碼
// appendChildPlus.js
/**
 * Created by jszhou on 2017/1/2.
 * updated by jszhou on 2017/1/3.
 */
(function () {
    /**
     * 把類數(shù)組對象轉(zhuǎn)換為數(shù)組。
     */
    var toArray = Array.from || function (arg) {
            return Array.prototype.slice.call(arg);
        };

    /**
     * 判斷參數(shù)是否為節(jié)點對象。
     * @param {?} arg
     * @return {boolean}
     */
    function isNode(arg) {
        return arg instanceof Node;
    }

    /**
     * 判斷參數(shù)是否為script節(jié)點對象。
     * @param {?} arg
     * @return {boolean}
     */
    function isScript(arg) {
        return isNode(arg) && arg.nodeName.toLowerCase() === "script";
    }

    /**
     * 復(fù)制script節(jié)點對象,復(fù)制以后script標簽的內(nèi)容可以運行。
     * @param {object} script script節(jié)點對象
     * @return {object} 返回新的script節(jié)點對象
     */
    function copyScript(script) {
        var newScript = document.createElement("script");

        // 復(fù)制屬性
        toArray(script.attributes).forEach(function (item) {
            newScript.setAttribute(item.nodeName, item.nodeValue);
        });

        newScript.innerHTML = script.innerHTML;

        return newScript;
    }

    /**
     * 替代script節(jié)點對象,替代以后script標簽的內(nèi)容可以運行。
     * @param {object} node 節(jié)點對象
     * @return {object} 返回script被替代的節(jié)點對象(script節(jié)點對象被替代成可以運行的)
     */
    function replaceAllScript(node) {
        Array.prototype.forEach.call(node.childNodes, function (item) {
            // 如果是script節(jié)點對象,則替代為可運行的script節(jié)點對象
            if(isScript(item)) {
                item.parentNode.replaceChild(copyScript(item), item);
                return;
            }
            // 遞歸
            if(item.childNodes.length > 0){
                replaceAllScript(item);
            }
        });

        return node;
    }

    /**
     * 字符串轉(zhuǎn)成文檔片段節(jié)點對象。
     * @param {String} str 字符串,可以包含script標簽,轉(zhuǎn)換完插入文檔以后可以運行。
     * @return {Object} 返回文檔片段節(jié)點對象
     */
    function strToNode(str) {
        var docFrag = document.createDocumentFragment(),
            div = document.createElement("div");

        div.innerHTML = str;

        toArray(replaceAllScript(div).childNodes).forEach(function (item) {
            docFrag.appendChild(item);
        });

        return docFrag;
    }

    /**
     * 用于擴展appendChild方法??梢詡魅雋tml字符串和節(jié)點對象,可以傳多個參數(shù)。
     * 如果html字符串中有script標簽,插入以后可以正常運行。
     * 注意,所有參數(shù)是一起插入指定節(jié)點的,而不是一個一個插入。
     */
    Node.prototype.appendChildPlus = function () {
        var docFrag = document.createDocumentFragment();

        toArray(arguments).forEach(function (arg) {
            docFrag.appendChild(isNode(arg) ? arg : strToNode(String(arg)));
        });

        this.appendChild(docFrag);
    };
})();
示例代碼
// extend.js
var wrap = document.querySelector(".js-wrap"),
    deepScript = "
", newScriptNode = document.createElement("script"), outerScript = ""; newScriptNode.textContent = "wrap.append("newScriptNode");"; wrap.appendChildPlus(deepScript, newScriptNode, outerScript, "
nihao
"); // outerScript.js wrap.append("outerScript");


nihao
deepScript newScriptNode outerScript
更多

本擴展的markdown和demo源文件在github上,點擊這里查看

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86757.html

相關(guān)文章

  • jQuery 源碼系列(十五)DOM 操作

    摘要:歡迎來我的專欄查看系列文章。所以內(nèi)部一個統(tǒng)一的做法,就是采用的方式,先對要進行操作的內(nèi)部函數(shù)執(zhí)行操作,然后回調(diào)執(zhí)行任務(wù)。剩下的事情,就交給回調(diào)函數(shù)去處理。所以,的作用遠比想象的要少。 歡迎來我的專欄查看系列文章。 可能你會覺得這個名字很奇怪這個名字很奇怪,為什么叫做 domManip,即所謂的 dom 微操作。 showImg(https://segmentfault.com/img/...

    PascalXie 評論0 收藏0
  • 自定義元素探秘及構(gòu)建可復(fù)用組件最佳實踐

    摘要:若自定義元素標簽名稱不可用則摒棄??傊远x元素讓開發(fā)者的代碼更易理解和維護,并分割為小型,可復(fù)用及可封裝的模塊。被稱為自定義元素接口,雖然現(xiàn)在仍然可用,但是已經(jīng)被棄用并被認為是糟糕的實現(xiàn)。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 這是 JavaScript 工作原理第十九章。 概述 在 前述文章中,我們介紹了 Shadow ...

    CoorChice 評論0 收藏0
  • Zepto 源碼分析 3 - qsa 實現(xiàn)與工具函數(shù)設(shè)計

    摘要:承接第一篇末尾內(nèi)容,本部分開始進入主模塊,分析其設(shè)計思路與實現(xiàn)技巧下文代碼均進行過重格式化,但代碼版本同第一部分內(nèi)容且入口函數(shù)不變的選擇器先從第一個與原型鏈構(gòu)造不直接相關(guān)的工具函數(shù)說起,觀察的設(shè)計思路。 承接第一篇末尾內(nèi)容,本部分開始進入 zepto 主模塊,分析其設(shè)計思路與實現(xiàn)技巧(下文代碼均進行過重格式化,但代碼 Commit 版本同第一部分內(nèi)容且入口函數(shù)不變): Zepto 的選...

    ctriptech 評論0 收藏0
  • 瀏覽器中的JavaScript:文檔對象模型與 DOM 操作

    摘要:作為運行在瀏覽器中的腳本語言,它對于網(wǎng)頁操作非常有用。在技術(shù)圈中,我們將這些指令稱為操作。結(jié)論文檔對象模型是瀏覽器創(chuàng)建并保留在內(nèi)存中的網(wǎng)頁的虛擬副本。資源如果你想了解更多關(guān)于文檔對象模型的內(nèi)容,那么還有另一篇好文章。 翻譯:瘋狂的技術(shù)宅原文:https://www.valentinog.com/bl... showImg(https://segmentfault.com/img/bV...

    Ilikewhite 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<