Выбор текста JS в Gmail - PullRequest
       41

Выбор текста JS в Gmail

1 голос
/ 27 января 2011

Я создаю букмарклет, который берет выбранный текст и отправляет его обратно на мой сервер, где он обрабатывается.Работает на любом сайте, кроме 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 ]

2 голосов
/ 18 мая 2011

Я столкнулся с той же проблемой и нашел твой вопрос, ища ответ сам.

Проблема в вашем коде, насколько я могу судить, не в том, что window.getSelection не определена в gmail, а в том, что getSelection (). ToString () возвращает строку нулевой длины, несмотря на то, что текст выделен.В Firefox решение Тима Дауна работало для меня, но не в Chrome, так как contentWindow недоступно.

Мой пересмотренный код ниже, который выполняет итерации, хотя любые фреймы на странице для меня работают в Firefox, Chrome и Safari.(Я не проверял это в других браузерах).

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; }
  }
}
0 голосов
/ 07 марта 2012

Это сработало для меня, используя Firefox 3.6 в Gmail,Функция getBrowserSelection () в файле browser.js в Chrome Firefox используется Firefox для поиска в контекстном меню.

var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
0 голосов
/ 27 января 2011

Последний случай прекрасно работает для меня в Gmail в Firefox.Однако в этом коде есть некоторые недостатки:

  • window.getSelection() возвращает объект Selection, а не строку (я вижу это везде. Я думаю, это ошибка ППК).Вам нужно selectedText = "" + window.getSelection();
  • Последний случай охватывает фреймы в браузерах не IE, но не IE;Я думаю (но не уверен), что document.activeElement в IE может указывать на 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;
  }
};
...