当前位置:首页 > 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;");
}

完整代码示例

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

<!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
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…