Gmail上的JS文本选择

时间:2011-01-27 16:19:06

标签: javascript gmail bookmarklet

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

3 个答案:

答案 0 :(得分:2)

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

据我所知,你的代码中的问题不是window.getSelection在gmail中是未定义的,但只是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; }
  }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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