当前位置:首页 > JavaScript

js实现表情评论

2026-02-03 02:06:35JavaScript

实现表情评论的基本思路

表情评论功能通常包括输入框、表情选择面板和评论展示区域。核心是通过JavaScript动态插入表情符号对应的HTML或Unicode字符到输入框,并将内容提交后渲染到页面。

HTML结构示例

<div class="comment-container">
  <textarea id="comment-input" placeholder="输入评论..."></textarea>
  <div class="emoji-panel">
    <span class="emoji" data-emoji="😀">😀</span>
    <span class="emoji" data-emoji="😂">😂</span>
    <!-- 更多表情... -->
  </div>
  <button id="submit-btn">提交评论</button>
  <div class="comment-list"></div>
</div>

JavaScript实现步骤

监听表情点击事件 表情选择面板中的每个表情元素需要绑定点击事件,将对应的表情符号插入到输入框的光标位置。

document.querySelectorAll('.emoji').forEach(item => {
  item.addEventListener('click', function() {
    const emoji = this.getAttribute('data-emoji');
    const input = document.getElementById('comment-input');
    const startPos = input.selectionStart;
    const endPos = input.selectionEnd;
    input.value = input.value.substring(0, startPos) + emoji + input.value.substring(endPos);
    input.focus();
    input.selectionStart = input.selectionEnd = startPos + emoji.length;
  });
});

提交评论处理 点击提交按钮时,获取输入框内容并添加到评论列表,同时清空输入框。

document.getElementById('submit-btn').addEventListener('click', function() {
  const content = document.getElementById('comment-input').value.trim();
  if (content) {
    const commentList = document.querySelector('.comment-list');
    const commentItem = document.createElement('div');
    commentItem.className = 'comment-item';
    commentItem.innerHTML = content;
    commentList.prepend(commentItem);
    document.getElementById('comment-input').value = '';
  }
});

增强功能:动态加载表情

可以通过第三方表情库(如Twemoji)或自定义表情包实现更丰富的选择。动态加载表情通常需要创建分页或分类面板。

// 示例:动态加载一组表情
const emojis = ['😊', '🤔', '🎉', '❤️', '🔥'];
const panel = document.querySelector('.emoji-panel');
emojis.forEach(emoji => {
  const span = document.createElement('span');
  span.className = 'emoji';
  span.textContent = emoji;
  span.setAttribute('data-emoji', emoji);
  panel.appendChild(span);
});

样式优化建议

为表情面板和评论区域添加基础CSS样式,提升用户体验:

.emoji-panel {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 10px 0;
}
.emoji {
  cursor: pointer;
  font-size: 24px;
}
.comment-item {
  border-bottom: 1px solid #eee;
  padding: 10px 0;
  white-space: pre-wrap;
}

安全注意事项

直接渲染用户输入的内容可能导致XSS攻击。建议在插入评论前对内容进行转义处理:

function escapeHtml(unsafe) {
  return unsafe
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

完整代码示例

整合上述模块的完整实现:

js实现表情评论

<!DOCTYPE html>
<html>
<head>
  <style>
    .emoji-panel { display: flex; flex-wrap: wrap; gap: 8px; margin: 10px 0; }
    .emoji { cursor: pointer; font-size: 24px; }
    .comment-item { border-bottom: 1px solid #eee; padding: 10px 0; }
    textarea { width: 100%; height: 80px; }
  </style>
</head>
<body>
  <div class="comment-container">
    <textarea id="comment-input"></textarea>
    <div class="emoji-panel"></div>
    <button id="submit-btn">提交</button>
    <div class="comment-list"></div>
  </div>

  <script>
    // 初始化表情
    const emojis = ['😀','😂','😊','🤔','🎉','❤️','🔥'];
    const panel = document.querySelector('.emoji-panel');
    emojis.forEach(emoji => {
      const span = document.createElement('span');
      span.className = 'emoji';
      span.textContent = emoji;
      span.setAttribute('data-emoji', emoji);
      panel.appendChild(span);
    });

    // 表情点击事件
    document.querySelectorAll('.emoji').forEach(item => {
      item.addEventListener('click', function() {
        const emoji = this.getAttribute('data-emoji');
        const input = document.getElementById('comment-input');
        const startPos = input.selectionStart;
        const endPos = input.selectionEnd;
        input.value = input.value.substring(0, startPos) + emoji + input.value.substring(endPos);
        input.focus();
        input.selectionStart = input.selectionEnd = startPos + emoji.length;
      });
    });

    // 提交评论
    document.getElementById('submit-btn').addEventListener('click', function() {
      const content = document.getElementById('comment-input').value.trim();
      if (content) {
        const commentList = document.querySelector('.comment-list');
        const commentItem = document.createElement('div');
        commentItem.className = 'comment-item';
        commentItem.textContent = content; // 使用textContent避免XSS
        commentList.prepend(commentItem);
        document.getElementById('comment-input').value = '';
      }
    });
  </script>
</body>
</html>

此实现提供了基础表情评论功能,可根据需求扩展表情分类、用户@功能或图片上传等高级特性。

标签: 表情js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…