老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網站建設、域名注冊、服務器等服務

Pjax 下動態(tài)加載插件方案

在純靜態(tài)網站里,有時候會動態(tài)更新某個區(qū)域往會選擇 Pjax(swup、barba.js)去處理,他們都是使用 ajax 和 pushState 通過真正的永久鏈接,頁面標題和后退按鈕提供快速瀏覽體驗。

我們提供的服務有:網站制作、成都網站制作、微信公眾號開發(fā)、網站優(yōu)化、網站認證、仁和ssl等。為成百上千家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的仁和網站制作公司

但是實際使用中可能會遇到不同頁面可能會需要加載不同插件處理,有些人可能會全量選擇加載,這樣會導致加載很多無用的腳本,有可能在用戶關閉頁面時都不一定會訪問到,會很浪費資源。

解決思路

首先想到的肯定是在請求到新的頁面后,我們手動去比較當前 DOM 和 新 DOM 之間 script 標簽的差異,手動給他插入到 body 里。

處理 Script

一般來說 JavaScript 腳本都是放在 body 后,避免阻塞頁面渲染,假設我們頁面腳本也都是在 body 后,并在 script 添加 [data-reload-script] 表明哪些是需要動態(tài)加載的。

首先我們直接獲取到帶有 [data-reload-script] 屬性的 script 標簽:

// NewHTML 為 新頁面 HTML
const pageContent = NewHTML.replace('', '
'); let element = document.createElement('div'); element.innerHTML = pageContent; const children = element.querySelector('#DynamicPluginBody').querySelectorAll('script[data-reload-script]');

然后通過創(chuàng)建 script 標簽插入到 body

children.forEach(item => {
    const element = document.createElement('script');
    for (const { name, value } of arrayify(item.attributes)) {
        element.setAttribute(name, value);
    }
    element.textContent = item.textContent;
    element.setAttribute('async', 'false');
    document.body.insertBefore(element)
})

如果你的插件都是通過 script 引入,且不需要執(zhí)行額外的 JavaScript 代碼,只需要在 Pjax 鉤子函數這樣處理就可以了。

執(zhí)行代碼塊

實際很多插件不僅僅需要你引入,還需要你手動去初始化做一些操作的。我們可以通過 src 去判斷是引入的腳本,還是代碼塊。

let scripts = Array.from(document.scripts)
let scriptCDN = []
let scriptBlock = []

children.forEach(item => {
    if (item.src)
        scripts.findIndex(s => s.src === item.src) < 0 && scriptCDN.push(item);
    else
        scriptBlock.push(item.innerText)
})

scriptCDN 繼續(xù)通過上面方式插入到 body 里,然后通過 eval 或者 new Function 去執(zhí)行 scriptBlock 。因為 scriptBlock 里的代碼可能是會依賴 scriptCDN 里的插件的,所以需要在 scriptCDN 加載完成后在執(zhí)行 scriptBlock 。

const loadScript = (item) => {
    return new Promise((resolve, reject) => {
        const element = document.createElement('script');
        for (const { name, value } of arrayify(item.attributes)) {
            element.setAttribute(name, value);
        }
        element.textContent = item.textContent;
        element.setAttribute('async', 'false');
        element.onload = resolve
        element.onerror = reject
        document.body.insertBefore(element)
    })
}

const runScriptBlock = (code) => {
    try {
        const func = new Function(code);
        func()
    } catch (error) {
        try {
            window.eval(code)
        } catch (error) {
        }
    }
}

Promise.all(scriptCDN.map(item => loadScript(item))).then(_ => {
    scriptBlock.forEach(code => {
        runScriptBlock(code)
    })
})

卸載插件

按照上面思去處理之后,會存在一個問題。 比如:我們添加了一個 全局的 'resize' 事件的監(jiān)聽,在跳轉其他頁面時候我們需要移除這個監(jiān)聽事件。

這個時候我們需要對代碼塊的格式進行一個約束,比如像下面這樣,在初次加載時執(zhí)行 mount 里代碼,頁面卸載時執(zhí)行 unmount 里代碼。


DynamicPlugin 大致結構:

let cacheMount = []
let cacheUnMount = []
let context = {}

class DynamicPlugin {
    add(options) {
        if (isFunction(options))
            cacheMount.push(options)

        if (isPlainObject(options)) {
            let { mount, unmount } = options
            if (isFunction(mount))
                cacheMount.push(mount)
            if (isFunction(unmount))
                cacheUnMount.push(unmount)
        }

        // 執(zhí)行當前頁面加載鉤子
        this.runMount()
    }

    runMount() {
        while (cacheMount.length) {
            let item = cacheMount.shift();
            item.call(context);
        }
    }

    runUnMount() {
        while (cacheUnMount.length) {
            let item = cacheUnMount.shift();
            item.call(context);
        }
    }
}

頁面卸載時調用 DynamicPlugin.runUnMount()。

處理 Head

Head 部分處理來說相對比較簡單,可以通過拿到新舊兩個 Head,然后循環(huán)對比每個標簽的 outerHTML,用來判斷哪些比是需要新增的哪些是需要刪除的。

結尾

本文示例代碼完整版本可以 參考這里


本文題目:Pjax 下動態(tài)加載插件方案
瀏覽地址:http://www.xueling.net.cn/article/dsojgog.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 少妇又紧又深又湿又爽视频 | 欧美一级特黄aaaaaaa色戒 | 欧美v国产v亚洲v日韩九九 | 亚洲区激情区无码区日韩区 | 久在线中文字幕乱码免费 | 日一区二区三区 | 色婷婷av一区二区三区久久 | 日本妈妈黄色片 | 日韩免费视频中文字幕 | 久久久久久久伊人 | 国产午夜福利精品一区二区三区 | 成人黄页网站 | 男女啪啪抽搐呻吟高潮动态图 | 亚洲中文字慕日产2021 | 色站在线 | 中国少妇无码专区 | 麻豆一区二区三区精品视频 | 日韩免费视频播放 | 九九九九九九九伊人 | 成人免费看片 | 夜夜夜夜猛噜噜噜噜噜婷婷 | 97caopron超碰公开 | 久草加勒比 | www.亚洲国产 | 四月是你的谎言动漫免费观看 | 风间由美一区二区三区在线观看 | 大地网资源在线观看免费高清 | 无码在线观看一区二区 | 午夜福利啪啪无遮挡免费 | 亚洲天堂中文在线 | 一区二区三区在线观看国产 | 欧美一级毛片免费看 | 亚洲卡1卡2卡三卡4卡5卡6卡 | 亚洲第一页色 | 一级生性活片免费视频片 | 亚洲aⅴ久久精品 | 久久99免费 | 亲含舔丰满湿插 | 新普新京亚洲欧美日韩国产 | 中文字幕精品一区 | 久久综合给合久久97色 |