【问题标题】:Working with emoji in editable div在可编辑的 div 中使用表情符号
【发布时间】:2016-09-06 11:17:47
【问题描述】:

我正在使用twemoji 库在输入字段中显示表情符号(可编辑的 div):

<div contenteditable="true" id="input_div"></div>

用户可以使用外部按钮添加表情符号,这样我就可以非常简单地将它添加到 div 中(不用关心插入符号的位置):

div.innerHTML += twemoji.parse(emoji);

接下来我需要使用表情符号从 div 获取用户输入,有没有一些简单的方法可以转换回 unicode 字符?

我当前的解决方案here(我只是解析&lt;img&gt; 以获取alt 属性)但我认为它看起来有点棘手,我不能使用div.innerText 属性(从div 获取纯文本非常方便)因为我会失去表情符号。我还使用div.getInnerText 来防止从剪贴板插入html或图像:

div.addEventListener("insert", () => {setTimeout(div.innerText = div.innerText,0)})

【问题讨论】:

  • 你会得到类似的东西作为可编辑元素的innerHTML,&lt;img class="emoji" draggable="false" alt="????" src="http://twemoji.maxcdn.com/36x36/1f600.png"&gt; - 所以你可以再次将它从img src中解析出来(看到1F600是你的代码点从中创建表情符号,因此这似乎直接反映在图像文件名中。)
  • @CBroe 请参考我在 plunker 上的链接,这正是我现在所做的(我解析 alt 属性,但没关系),对我来说它看起来不方便,因为我使用 div.innerText 属性从没有任何 html 的 div 中获取干净的文本
  • “我解析了 alt 属性,但没关系” - 如果 alt 属性不包含您想要的内容,这很重要。 alt="????" – 看到那个替换字符了吗? (这是从简单地将 innerHTML 记录到控制台中复制的。)这很可能意味着您使用的库写入属性的内容不是有效的 unicode 代码点。 (单击“获取文本”按钮后,我会在您的文本区域下看到完全相同的字符 - 因此您的代码可以正常工作,它只适用于已经损坏的输入数据。)
  • @CBroe alt 属性不包含 unicode 代码点,但它包含应该对应于该代码点的代理符号,据我所知,在这种情况下,使用代码点和 \u 字符组之间没有区别,不是吗?可以肯定的是,在您的评论中,我看到对应 1F607 代码点的表情符号。我用标准字体在 OSX 和 Windows7/10 上检查了它
  • @CBroe 看来我没有正确理解你,你的意思是“它只适用于已经损坏的输入数据。”?

标签: javascript html css emoji


【解决方案1】:

所以我创建了一个带有漂亮 twemoji 选项卡的可编辑 div,就像 WhatsApp 一样!

我稍微编辑了 Twemoji 脚本以使其完美运行。伙计们辛苦了!

这里是fidddle

以及将 unicode 转换为 twemoji 图像和切换标签的代码:

  function convert() {
    document.body.innerHTML = twemoji.parse(document.body.innerHTML);
  }
  convert();

  $(document).delegate('.emoji-header button', 'click', function() {
    index = $(this).index()
    $('.emoji-panel').css({
      'transform': 'translateX(-' + index + '00%)'
    });
  });

  $('.emoji-panel .emojicon').on('click', function() {
    $('.message').append($('img', this).clone());
  });
  $('.message').on('keypress', function(event) {
    if (event.keyCode == 13 && !event.shiftKey) {
      event.preventDefault();
    }
  });

编码愉快,顺便提个很好的问题!

【讨论】:

  • 看起来很棒!但是我发现了一个小问题,在解析输入的消息时会引起一些麻烦,只需将.emojicon {font-size: 35px;} 添加到 css 并尝试在 emoji char 之后输入文本(因为 div.emojicon 不知道你为什么需要它) .而且它仍然不是原始问题的答案,至少我没有看到它,您建议如何在单击按钮后发送消息?
  • 您必须了解,转换为图像的 unicode 字符不受字体大小的影响。因此,如果可编辑的 div 假设为 font-size 18px,您可以将 .emojicon {height: 1em; width: 1em;} 添加到 css 并解决该问题。要发送消息,只需使用 php 或 ajax,确保该字段具有 charset utf-8,当从数据库中获取此内容时,只需使用此答案中的 convert() 函数
  • 当然可以,但是您在.emojicon div 附近输入的文本会受到其字体大小的影响,并且实际上是插入到div.emojicon 中,并且可能会使消息解析更加复杂。要解决它需要为div.emojicon 指定contenteditable=false。当我说“如何打磨”时,我的意思是我仍然需要以某种方式将带有表情符号 imgs 的文本转换为字符串,最初的问题是关于这种转换
  • 您可以使用 php 或 ajax 将一段代码、带有标签的文本或脚本解析为字符串。网络上到处都有解决方案;使用 htmlentities(string) 将其放入数据库,再次获取时使用 html_entity_decode(string) 。 (这是 php,但它们也有 jquery 函数)希望这有帮助,让我知道。
  • @user1162084 这是很久以前的事了,但我认为这可能会对您有所帮助:developer.mozilla.org/en-US/docs/Web/API/Selection
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 2021-03-21
  • 2018-10-16
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多