【问题标题】:JS text selection on GmailGmail 上的 JS 文本选择
【发布时间】:2026-01-03 14:50:02
【问题描述】:

我正在构建一个小书签,用于获取所选文本并将其发送回我的服务器进行处理。它适用于除 Gmail 之外的所有网站。任何人都知道如何让它在 Gmail 上运行。这是我正在使用的代码:

var selectedText = '';
if (window.getSelection) {
  selectedText = window.getSelection();
} else if (document.getSelection) {
  selectedText = document.getSelection();
} else if (document.selection) {
  selectedText = document.selection.createRange().text;
} else {
  selectedText = document.activeElement.contentWindow.getSelection();
};

【问题讨论】:

  • 我觉得无论谁投了反对票而没有评论原因,这很糟糕。好问题康纳,祝你好运。 Goshido 听起来像是一次了不起的冒险。
  • Here is a more general solution 也适用于框架内的选定文本。

标签: javascript gmail bookmarklet


【解决方案1】:

我遇到了同样的问题,发现您的问题正在寻找自己的答案。

据我所知,您的代码中的问题不是 gmail 中未定义 window.getSelection,而是尽管选择了文本,但 getSelection().toString() 返回零长度字符串。在 Firefox 中,Tim Down 的解决方案对我有用,但在 Chrome 中却没有,因为 contentWindow 不可用。

我在下面的修改后的代码迭代页面上的任何框架在 Firefox、Chrome 和 Safari 中的 Gmail 中为我工作。 (我没有在其他浏览器中测试过)。

var selectedText = '';
if (window.getSelection) { 
  selectedText = window.getSelection().toString(); 
}
if (selectedText == '') {
  var frames = window.frames; 
  for (var i = 0; i < frames.length; i++) { 
    if (selectedText == '') { 
      selectedText = frames[i].document.getSelection().toString(); 
    }
    else { break; }
  }
}

【讨论】:

  • 很好的解决方案。正如您以编程方式演示的那样,您不能依赖父 window 中的文本选择。
【解决方案2】:

最后一个案例在 Firefox 的 Gmail 中对我来说很好。不过,该代码存在一些缺陷:

  • window.getSelection() 返回一个 Selection 对象,而不是一个字符串(我到处都看到这个。我认为这是 PPK 的错)。你需要selectedText = "" + window.getSelection();
  • 最后一个案例涵盖了非 IE 浏览器中的 iframe,但不包括 IE;我认为(但不确定)IE 中的 document.activeElement 可以指向 iframe。

修改后的代码:

var selectedText = '';
if (window.getSelection) {
  selectedText = "" + window.getSelection();
} else if (document.getSelection) {
  selectedText = document.getSelection();
} else if (document.selection) {
  selectedText = document.selection.createRange().text;
} else if (document.activeElement.contentWindow) {
  var win = document.activeElement.contentWindow;
  if (win.getSelection) {
    selectedText = win.getSelection();
  } else if (win.document.selection) {
    selectedText = win.document.selection.createRange().text;
  }
};

【讨论】:

  • 感谢蒂姆的帮助,但这对我在 Gmail 中不起作用。
  • @conorwade:然后需要更多详细信息,例如浏览器、您在 Gmail 中的哪个视图以及选择的位置。
【解决方案3】:

这对我在 gmail 中使用 firefox 3.6 有效,
Firefox 的 chrome 中的 browser.js 文件中的函数 getBrowserSelection() 被 Firefox 用于上下文菜单搜索..

var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();

【讨论】: