当前位置:首页 > JavaScript

Js实现划词翻译

2026-01-31 04:09:54JavaScript

实现划词翻译的基本思路

划词翻译的核心是监听用户鼠标选中文本的事件,获取选中内容后调用翻译API,最后以弹窗等形式展示翻译结果。以下是具体实现方法:

监听文本选中事件

通过mouseup事件监听用户鼠标释放动作,结合window.getSelection()获取选中文本:

Js实现划词翻译

document.addEventListener('mouseup', function(e) {
  const selection = window.getSelection();
  const selectedText = selection.toString().trim();
  if (selectedText.length > 0) {
    // 后续处理逻辑
  }
});

调用翻译API

可以使用免费翻译API如Google Translate或百度翻译API。以下是使用百度翻译API的示例(需提前申请API key):

function translateText(text, callback) {
  const appid = 'YOUR_APP_ID'; // 替换为实际ID
  const key = 'YOUR_SECRET_KEY'; // 替换为实际密钥
  const salt = Date.now();
  const sign = md5(appid + text + salt + key); // 需要实现MD5哈希

  fetch(`https://fanyi-api.baidu.com/api/trans/vip/translate?q=${encodeURIComponent(text)}&from=en&to=zh&appid=${appid}&salt=${salt}&sign=${sign}`)
    .then(response => response.json())
    .then(data => callback(data.trans_result[0].dst));
}

显示翻译结果

创建悬浮窗显示翻译结果,使用CSS定位到鼠标位置:

Js实现划词翻译

function showTranslation(text, x, y) {
  let popup = document.getElementById('translation-popup');
  if (!popup) {
    popup = document.createElement('div');
    popup.id = 'translation-popup';
    popup.style.cssText = 'position:absolute;background:#fff;padding:8px;border:1px solid #ddd;z-index:9999;';
    document.body.appendChild(popup);
  }
  popup.textContent = text;
  popup.style.left = `${x}px`;
  popup.style.top = `${y + 20}px`;
  popup.style.display = 'block';
}

完整代码整合

将各部分逻辑整合,注意添加防抖处理和事件委托:

document.addEventListener('mouseup', debounce(function(e) {
  const selection = window.getSelection();
  const text = selection.toString().trim();
  if (text.length > 0) {
    translateText(text, function(translated) {
      showTranslation(translated, e.clientX, e.clientY);
    });
  }
}, 300));

function debounce(fn, delay) {
  let timer;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, arguments), delay);
  };
}

样式优化建议

为悬浮窗添加CSS样式提升用户体验:

#translation-popup {
  max-width: 300px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.2);
  border-radius: 4px;
  font-size: 14px;
  line-height: 1.5;
  animation: fadeIn 0.2s ease;
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(5px); }
  to { opacity: 1; transform: translateY(0); }
}

注意事项

  1. 翻译API通常有请求频率限制,需要做好错误处理和缓存机制
  2. 移动端需要额外处理touch事件
  3. 对于付费API需注意密钥安全性,前端直接暴露密钥存在风险
  4. 可考虑使用浏览器扩展的content script实现更稳定的划词功能

标签: Js
分享给朋友:

相关文章

怎么用Js实现图片移动

怎么用Js实现图片移动

使用JavaScript实现图片移动 通过修改CSS属性实现移动 使用JavaScript动态修改图片的style.left和style.top属性可以实现移动效果。需要将图片的position属性设…

Js实现const

Js实现const

在 JavaScript 中,const 是用于声明常量的关键字,其值在声明后不能被重新赋值。以下是关于 const 的详细说明和用法: 基本语法 const identifier = value;…

Js实现decimal

Js实现decimal

实现 Decimal 类型的方法 在 JavaScript 中,原生不支持精确的 Decimal 类型,但可以通过以下方法实现高精度小数运算。 使用第三方库 推荐使用成熟的第三方库来处理 Decim…

怎么用Js实现图片移动

怎么用Js实现图片移动

使用CSS和JavaScript实现图片移动 通过修改图片的CSS属性(如left、top或transform)可以实现图片移动效果。以下是两种常见方法: 方法一:通过修改left和top属性 假设…

Js实现划词翻译

Js实现划词翻译

划词翻译的实现思路 划词翻译功能可以通过监听用户鼠标选中文本的事件,获取选中的文本内容,然后调用翻译API进行翻译,最后将翻译结果显示在页面上。 获取选中文本 通过window.getSelecti…

Js实现reset

Js实现reset

重置表单元素 在JavaScript中重置表单可以通过调用表单元素的reset()方法实现。该方法会将所有表单控件恢复到初始值。 document.getElementById('myForm').…