2011-01-27 3 views
1

Я создаю букмарклет, который берет выделенный текст и отправляет его обратно на мой сервер, где он обрабатывается. Он работает на всех сайтах, кроме Gmail. Кто-нибудь знает, как заставить его работать в Gmail. Вот код, который я использую:Выбор текста JS в 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(); 
}; 
+1

Я нахожу это довольно хромым, что кто-то проголосовал без комментариев о том, почему. Хороший вопрос Конор, и удачи. Гошидо звучит как удивительное приключение. – sholsinger

+0

[Вот более общее решение] (http://stackoverflow.com/questions/808744/how-to-find-selection-in-html-document-that-contains-iframe-or-just-frames), который также работает для выделенного текста внутри фреймов. – Sport

ответ

2

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

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

Мой пересмотренный код, который выполняет итерации, хотя любые кадры на странице работают в Gmail для меня в 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

Отличное решение. Поскольку вы продемонстрировали программно, вы не можете полагаться на выбор текста в родительском _window_. – sholsinger

0

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

  • window.getSelection() возвращает Selection объект, а не строка (я вижу это везде я думаю, что это вина ППК в.). Вам нужно selectedText = "" + window.getSelection();
  • Последний чехол покрывает iframe в браузерах, отличных от IE, но не IE; Я думаю (но не уверен), что document.activeElement в IE может указывать на iframe.

Revised код:

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; 
    } 
}; 
+0

Спасибо за помощь Тим, но это не работает для меня в Gmail. – conorwade

+0

@conorwade: требуется больше данных, таких как браузер, которые отображаются в Gmail, где вы находитесь, и где находится выбор. –

0

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

var focusedWindow = document.commandDispatcher.focusedWindow; 
var selection = focusedWindow.getSelection(); 
Смежные вопросы