Gmail 上的 JS 文本选择

发布于 2024-10-14 07:35:50 字数 458 浏览 3 评论 0原文

我正在构建一个书签,它获取所选文本并将其发送回我的服务器进行处理。它适用于除 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();
};

I'm building a bookmarklet that takes the selected text and sends it back to my server where it is processed. It works on every site except Gmail. Anyone know how to get it to work on Gmail. Here is the code I'm using:

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();
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

世态炎凉 2024-10-21 07:35:50

我遇到了同样的问题,并发现你的问题正在寻找答案。

据我所知,代码中的问题不是 window.getSelection 在 gmail 中未定义,而只是 getSelection().toString() 返回零长度字符串,尽管选择了文本。在 Firefox 中,蒂姆·唐的解决方案对我有用,但在 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; }
  }
}

I had hit the same problem and found your question looking for an answer myself.

The issue in your code, as far as I can tell, is not that window.getSelection is undefined in gmail, but simply that getSelection().toString() returns a zero length string despite text being selected. In Firefox Tim Down's solution worked for me but not in Chrome as contentWindow in not available.

My revised code below which iterates though any frames on the page is working in Gmail for me in Firefox, Chrome and Safari. (I've not tested it in other browsers).

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; }
  }
}
倒带 2024-10-21 07:35:50

最后一个案例在 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;
  }
};

The last case works fine for me in Gmail in Firefox. There are some flaws with that code though:

  • window.getSelection() returns a Selection object, not a string (I see this everywhere. I think it's PPK's fault). You need selectedText = "" + window.getSelection();
  • The final case covers iframes in non-IE browsers but not IE; I think (but am not certain) that document.activeElement in IE can point to an iframe.

Revised code:

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;
  }
};
情归归情 2024-10-21 07:35:50

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

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

This worked for me using firefox 3.6 in gmail,
A function getBrowserSelection() in the browser.js file in Firefox’s chrome is used by Firefox for the contextual menu search ..

var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文