:原生發帖的時候,emoji表情嵌套在正文里,可能存在一個,或者多個,前端如何才能正常展示?
第二:原生再次編輯帖子的時候,他怎么拿到emoji,正常顯示呢?
后臺將emoji表情搞成鏈接,嵌套在正文里???鏈接長度和內容不可控,肯定不行。
下面我直接說經過討論后的解決方案,我只說前端部分,原生那邊解決方法是同理,大家以后遇到這樣的需求,僅供參考,后面封裝了js代碼,可以直接調用方法,提一下,我用的是vue框架
原生編輯帖子,將對應的emoji表情用對應的字段表示,這個大家要約定好,比如emoji1 表示微笑,emoji2表示沮喪,直接發送給后臺,前端調用后臺接口,得到含有emoji標記字段的正文內容,對正文進行查找,如果存在標記字段,用img 標簽替換所有的emoji 字段,將存儲在本地對應的emoji圖片路徑綁定在img的src上,將處理好的正文,v-html渲染
<template> <div> <div v-html="Emoji('要處理的內容')"></div> </div> </template> import { Emoji } from './../static/js/Emoji.js' export default { Emoji:Emoji }
下面是封裝的emoji方法
var emojiArr = []; // 用于存儲emoji的空數組 var devicePixelRatio = ''// 設備像素比 var fn= () =>{ devicePixelRatio = window.devicePixelRatio } fn() var emojisNum = 48; // 當前本地emoji表情的數量 //循環出emoji數組 for (let i = 1; i <= emojisNum; i++) { let url = require(`../../static/images/emoji/emoji_${i}@${devicePixelRatio}x.png`); emojiArr.push({ url: url, str: `[emoji_${i}]` }) } //接收到的字符串與命名好的emoji字符串匹配 const getEmoji = (str) => { for (let i = 0; i < emojisNum; i++) { if (str == emojiArr[i].str) { return emojiArr[i].url; } } return str; }; //相匹配的字符串則替換成emoji圖片 export function Emoji(value) { let emojiArrMatch = value.match(/[emoji_(.{1,4})]/ig) || []; let len = emojiArrMatch.length; if (len == 0) { //如果正文里沒有emoji字段,原文輸出 return value; } emojiArrMatch.forEach(function(item) { let url = getEmoji(item); value = value.replace(item, `<img class=emoji src=${url}>`); }) return value; }