在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

微信小程序中如何渲染html內容(代碼示例)

微信小程序中如何渲染html內容(代碼示例)

更新時間:2025-09-20 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
本篇文章給大家帶來的內容是關于微信小程序中如何渲染html內容(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

大部分Web應用的富文本內容都是以HTML字符串的形式存儲的,通過HTML文檔去展示HTML內容自然沒有問題。但是,在微信小程序(下文簡稱為「小程序」)中,應當如何渲染這部分內容呢?

解決方案

wxParse

小程序剛上線那會兒,是無法直接渲染HTML內容的,于是就誕生了一個叫做「 wxParse 」的庫。它的原理就是把HTML代碼解析成樹結構的數據,再通過小程序的模板把該數據渲染出來。

rich-text

后來,小程序增加了「rich-text」組件用于展示富文本內容。然而,這個組件存在一個極大的限制: 組件內屏蔽了所有節點的事件 。也就是說,在該組件內,連「預覽圖片」這樣一個簡單的功能都無法實現。

web-view

再后來,小程序允許通過「web-view」組件嵌套網頁,通過網頁展示HTML內容是兼容性最好的解決方案了。然而,因為要多加載一個頁面,性能是較差的。

當「WePY」遇上「wxParse」

基于用戶體驗和功能交互上的考慮,我們拋棄了「rich-text」和「web-view」這兩個原生組件,選擇了「wxParse」。然而,用著用著卻發現,「wxParse」也不能很好地滿足需要:

  • 我們的小程序是基于「WePY」框架開發的,而「wxParse」是基于原生的小程序編寫的。要想讓兩者兼容,必須修改「wxParse」的源代碼。

  • 「wxParse」只是簡單地通過image組件對原img元素的圖片進行顯示和預覽。而在實際使用中,可能會用到云存儲的接口對圖片進行縮小,達到「 用小圖顯示,用原圖預覽 」的目的。

  • 「wxParse」直接使用小程序的video組件展示視頻,但是video組件的 層級問題 經常導致UI異常(例如把某個固定定位的元素給擋了)。

此外,圍觀一下「wxParse」的代碼倉庫可以發現,它已經兩年沒有迭代了。所以就萌生了基于「WePY」的組件模式重新寫一個富文本組件的想法,其成果就是「WePY HTML」項目。

實現過程

解析HTML

首先仍然是要把HTML字符串解析為樹結構的數據,我采用的是「特殊字符分隔法」。HTML中的特殊字符是「<」和「>」,前者為開始符,后者為結束符。

?如果待解析內容以開始符開頭,則截取 開始符到結束符之間 的內容作為節點進行解析。
?如果待解析內容不以開始符開頭,則截取 開頭到開始符之前 (如果開始符不存在,則為末尾)的內容作為純文本解析。
?剩余內容進入下一輪解析,直到無剩余內容為止。
正如下圖所示:

13133049-23db30359eab3e6e.png

為了形成樹結構,解析過程中要維護一個上下文節點(默認為根節點):

?如果截取出來的內容是開始標簽,則根據匹配出的標簽名和屬性,在當前上下文節點下創建一個子節點。如果該標簽不是自結束標簽(br、img等),就把上下文節點設為新節點。
?如果截取出來的內容是結束標簽,則根據標簽名關閉當前上下文節點(把上下文節點設為其父節點)。
?如果是純文本,則在當前上下文節點下創建一個文本節點,上下文節點不變。
過程正如下面的表格所示:

13133049-4c044ef7a54fbf5f.png

經過上述流程,HTML字符串就被解析為節點樹了。

對比
把上述算法與其他類似的解析算法進行對比(性能以「解析10000長度的HTML代碼」進行測定):

13133049-ccb215322353e4c0.png

可見,在不考慮容錯性(產生錯誤的結果,而非拋出異常)的情況下,本組件的算法與其余兩者相比有壓倒性的優勢,符合小程序「 小而快 」的需要。而一般情況下,富文本編輯器所生成的代碼也不會出現語法錯誤。因此,即使容錯性較差,問題也不大(但這是需要改進的)。

模板渲染

樹結構的渲染,必然會涉及到子節點的 遞歸 處理。然而,小程序的模板并不支持遞歸,這下仿佛掉入了一個大坑。

看了一下「wxParse」模板的實現,它采用簡單粗暴的方式解決這個問題:通過13個長得幾乎一模一樣的模板進行嵌套調用(1調用2,2調用3,……,12調用13),也就是說最多可以支持12次嵌套。一般來說,這個深度也足夠了。

由于「WePY」框架本身是有構建機制的,所以不必手寫十來個幾乎一模一樣的模板,通過一個構建的插件去生成即可。

以下為需要重復嵌套的模板(精簡過),在其代碼的開始前和結束后分別插入特殊注釋進行標識,并在需要嵌入下一層模板的地方以另一段特殊注釋(「<!-- next template -->」)標識:

<!-- wepyhtml-repeat start -->
<template name="wepyhtml-0">
    <block wx:if="{{ content }}" wx:for="{{ content }}">
        <block wx:if="{{ item.type === 'node' }}">
            <view class="wepyhtml-tag-{{ item.name }}">
                <!-- next template -->
            </view>
        </block>
        <block wx:else>{{ item.text }}</block>
    </block>
</template>
<!-- wepyhtml-repeat end -->

以下是對應的構建代碼(需要安裝「 wepy-plugin-replace 」):

// wepy.config.js
{
    plugins: {
        replace: {
            filter: /\.wxml$/,
            config: {
                find: /<\!-- wepyhtml-repeat start -->([\W\w]+?)<\!-- wepyhtml-repeat end -->/,
                replace(match, tpl) {
                    let result = '';
                    // 反正不要錢,直接寫個20層嵌套
                    for (let i = 0; i <= 20; i++) {
                        result += '\n' + tpl
                            .replace('wepyhtml-0', 'wepyhtml-' + i)
                            .replace(/<\!-- next template -->/g, () => {
                                return i === 20 ?
                                    '' :
                                    `<template is="wepyhtml-${ i + 1 }" wx:if="{{ item.children }}" data="{{ content: item.children"></template>`;
                            });
                    }
                    return result;
                }
            }
        }
    }
}

然而,運行起來后發現,第二層及更深層級的節點都沒有渲染出來,說明嵌套失敗了。再看一下dist目錄下生成的wxml文件可以發現,變量名與組件源代碼的并不相同:

<block wx:if="{{ $htmlContent$wepyHtml$content }}" wx:for="{{ $htmlContent$wepyHtml$content }}">

「WePY」在生成組件代碼時,為了避免組件數據與頁面數據的變量名沖突,會 根據一定的規則給組件的變量名增加前綴 (如上面代碼中的「$htmlContent$wepyHtml$」)。所以在生成嵌套模板時,也必須使用帶前綴的變量名。

先在組件代碼中增加一個變量「thisIsMe」用于識別前綴:

<!-- wepyhtml-repeat start -->
<template name="wepyhtml-0">
    {{ thisIsMe }}
    <block wx:if="{{ content }}" wx:for="{{ content }}">
        <block wx:if="{{ item.type === 'node' }}">
            <view class="wepyhtml-tag-{{ item.name }}">
                <!-- next template -->
            </view>
        </block>
        <block wx:else>{{ item.text }}</block>
    </block>
</template>
<!-- wepyhtml-repeat end -->

然后修改構建代碼:

replace(match, tpl) {
    let result = '';
    let prefix = '';

    // 匹配 thisIsMe 的前綴
    tpl = tpl.replace(/\{\{\s*(\$.*?\$)thisIsMe\s*\}\}/, (match, p) => {
        prefix = p;
        return '';
    });

    for (let i = 0; i <= 20; i++) {
        result += '\n' + tpl
            .replace('wepyhtml-0', 'wepyhtml-' + i)
            .replace(/<\!-- next template -->/g, () => {
                return i === 20 ?
                    '' :
                    `<template is="wepyhtml-${ i + 1 }" wx:if="{{ item.children }}" data="{{ ${ prefix }content: item.children }}"></template>`;
            });
    }

    return result;
}

至此,渲染問題就解決了。

圖片
為了節省流量和提高加載速度,展示富文本內容時,一般都會按照所需尺寸對里面的圖片進行縮小,點擊小圖進行預覽時才展示原圖。這主要涉及節點屬性的修改:

?把圖片原路徑(src屬性值)存到自定義屬性(例如「src」)中,并將其添加到預覽圖數組。
?把圖片的src屬性值修改為縮小后的圖片URL(一般云服務商都有提供此類URL規則)。
?點擊圖片時,使用自定義屬性的值進行預覽。
為了實現這個需求,本組件在解析節點時提供了一個鉤子( onNodeCreate ):

onNodeCreate(name, attrs) {
    if (name === 'img') {
        attrs['src'] = attrs.src;
        // 預覽圖數組
        this.previewImgs.push(attrs.src);
        // 縮圖
        attrs.src = resizeImg(attrs.src, 640);
    }
}

對應的模板和事件處理邏輯如下:

<template name="wepyhtml-img">
    <image class="wepyhtml-tag-img" mode="widthFix" src="{{ elem.attrs.src }}" src="{{ elem.attrs['src'] || elem.attrs.src }}" @tap="imgTap"></image>
</template>
// 點擊小圖看大圖
imgTap(e) {
    wepy.previewImage({
        current: e.currentTarget.dataset.src,
        urls: this.previewImgs
    });
}

視頻

在小程序中,video組件的層級是較高的(且無法降低)。如果頁面設計上存在著可能擋住視頻的元素,處理起來就需要一些技巧了:

?隱藏video組件,用image組件(視頻封面)占位;
?點擊圖片時,讓視頻全屏播放;
?如果退出了全屏,則暫停播放。
相關代碼如下:

<template name="wepyhtml-video">
    <view class="wepyhtml-tag-video" @tap="videoTap" data-nodeid="{{ elem.nodeId }}">
        <!-- 視頻封面 -->
        <image class="wepyhtml-tag-img wepyhtml-tag-video__poster" mode="widthFix" src="{{ elem.attrs.poster }}"></image>
        <!-- 播放圖標 -->
        <image class="wepyhtml-tag-img wepyhtml-tag-video__play" src="./imgs/icon-play.png"></image>
        <!-- 視頻組件 -->
        <video style="display: none;" src="{{ elem.attrs.src }}" id="wepyhtml-video-{{ elem.nodeId }}" @fullscreenchange="videoFullscreenChange" @play="videoPlay"></video>
    </view>
</template>
{
    // 點擊封面圖,播放視頻
    videoTap(e) {
        const nodeId = e.currentTarget.dataset.nodeid;
        const context = wepy.createVideoContext('wepyhtml-video-' + nodeId);
        context.play();
        // 在安卓微信下,如果視頻不可見,則調用play()也無法播放
        // 需要再調用全屏方法
        if (wepy.getSystemInfoSync().platform === 'android') {
            context.requestFullScreen();
        }
    },
    // 視頻層級較高,為防止遮擋其他特殊定位元素,造成界面異常,
    // 強制全屏播放
    videoPlay(e) {
        wepy.createVideoContext(e.currentTarget.id).requestFullScreen();
    },
    // 退出全屏則暫停
    videoFullscreenChange(e) {
        if (!e.detail.fullScreen) {
            wepy.createVideoContext(e.currentTarget.id).pause();
        }
    }
}

以上就是微信小程序中如何渲染html內容(代碼示例)的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 日韩欧美xxxx| 一级淫片在线观看| 久久亚洲国产成人精品无码区 | 久久精品视频91| 国产曰肥老太婆无遮挡| 国产手机视频在线观看| 免费看av软件| 欧洲xxxxx| 无码人妻少妇伦在线电影| 国产欧美综合一区| 久久精品无码中文字幕| 日韩视频 中文字幕| av磁力番号网| 国产精品12345| 精品www久久久久奶水| 日本老熟妇毛茸茸| 欧美激情第3页| 在线观看视频黄色| 欧美精品卡一卡二| av网站在线观看不卡| 91香蕉视频导航| 91香蕉视频在线观看视频| 国产在线拍揄自揄拍无码| 国产精品视频一二三四区| 欧美视频在线观看视频| 99视频精品免费| 先锋影音男人资源| 国产成人精品无码播放| 日韩 国产 一区| 激情深爱综合网| 红桃视频 国产| 人人妻人人添人人爽欧美一区| 黄色av免费在线播放| 亚洲成年人专区| 欧美 国产 日本| 色香蕉在线观看| 国产一区二区三区精彩视频| jizz欧美性11| 青娱乐自拍偷拍| 一级黄色免费在线观看| caopor在线视频| 无码熟妇人妻av在线电影| 国产一二三四在线视频| 人妻激情另类乱人伦人妻| 777视频在线| 欧美韩国日本在线| 日韩免费在线观看av| 欧美成人手机在线视频| 国产精品少妇在线视频| 日韩一级片免费视频| 久久婷婷中文字幕| 爆乳熟妇一区二区三区霸乳| 成人免费观看cn| 91免费国产精品| 91视频福利网| 亚洲五月激情网| 男人添女人下面免费视频| 日韩黄色片视频| 国产l精品国产亚洲区久久| 日韩视频 中文字幕| 黄色一级视频播放| 中文字幕在线视频一区二区| 午夜宅男在线视频| 日本成人在线免费视频| 欧美爱爱视频免费看| 国产精品又粗又长| 亚洲中文字幕无码av永久| 九九九九九九九九| 久久久国产精华液999999 | 久久香蕉视频网站| 免费cad大片在线观看| 国产高清免费在线| 2021狠狠干| 日本wwwcom| 国产老熟妇精品观看| 欧美在线观看成人| 国产xxxxx视频| 中文字幕成人免费视频| 日本一二三四区视频| 真人做人试看60分钟免费| 黄色激情在线视频| 国产最新免费视频| 三级视频中文字幕| 天堂v在线视频| 中国丰满熟妇xxxx性| 丰满少妇被猛烈进入高清播放| 成人黄色一区二区| 91欧美一区二区三区| 国产精品国产三级国产专区51| 欧美视频在线第一页| 欧美性久久久久| 国产91色在线观看| 欧美久久在线观看| 最新中文字幕2018| 国产欧美久久久久| 亚洲最大综合网| 看全色黄大色大片| 午夜dv内射一区二区| 性欧美在线视频| 国产a级片网站| 日本高清久久久| 日韩av三级在线| 亚洲天堂av一区二区三区| 国产美女网站在线观看| 一区二区三区国产好的精华液| 国产妇女馒头高清泬20p多| 成年人三级黄色片| 两根大肉大捧一进一出好爽视频| 嫩草视频免费在线观看| 人人妻人人添人人爽欧美一区| 香蕉视频色在线观看| 超碰97人人射妻| 999一区二区三区| xxxx在线免费观看| 成人在线免费播放视频| www插插插无码免费视频网站| 国产性生交xxxxx免费| 久久久久久免费看| 国产日韩视频在线播放| 最新国产黄色网址| 激情五月亚洲色图| 欧美在线观看成人| 欧美激情视频免费看| 91大学生片黄在线观看| 亚洲一区在线不卡| 青青草国产精品视频| 日韩欧美一区二| www.精品在线| 欧美国产在线一区| 九九九在线观看视频| 国模吧无码一区二区三区| 日韩精品一区在线视频| 久久久一二三四| 日韩成人av免费| √天堂资源在线| 图片区乱熟图片区亚洲| 国产精品自在自线| 国产在线观看中文字幕| 999在线精品视频| 欧美精品 - 色网| 国产高清免费在线| av影院在线播放| 国产精品久久国产| 僵尸世界大战2 在线播放| r级无码视频在线观看| 免费看一级大黄情大片| 国产原创popny丨九色| 国产h视频在线播放| www.天天射.com| 亚洲18在线看污www麻豆| 天天久久综合网| 日韩在线视频在线| 日本在线观看a| 亚洲最大天堂网| 国产片侵犯亲女视频播放| 免费观看美女裸体网站| 99精品视频播放| 国产一级片中文字幕| 成年人看的毛片| 蜜臀视频一区二区三区| 捷克做爰xxxⅹ性视频| 18禁裸男晨勃露j毛免费观看| 欧美亚洲国产成人| 亚洲免费黄色网| 亚洲人成无码网站久久99热国产| 久久人妻精品白浆国产| 看一级黄色录像| xxxx一级片| 久久精品国产sm调教网站演员| 日韩精品视频久久| 国产一区一区三区| av丝袜天堂网| 国产午夜大地久久| 色姑娘综合天天| 免费看污黄网站| 可以在线看的av网站| 久久艹这里只有精品| 手机看片福利盒子久久| www.九色.com| 大桥未久一区二区三区| 538在线视频观看| www.av毛片| 欧美日韩亚洲国产成人| 视频二区在线播放| 欧洲黄色一级视频| 国产天堂视频在线观看| 久久出品必属精品| 天天操狠狠操夜夜操| 黄色片视频在线免费观看| 粉嫩av一区二区三区天美传媒 | 日本888xxxx| 情侣黄网站免费看| 欧美一级免费播放| 奇米777四色影视在线看| 亚洲免费黄色录像| 天天干天天综合| 色www免费视频| 亚洲36d大奶网| 天天摸天天舔天天操| www.cao超碰|