изменить код javascript так, чтобы он получал выделенный в данный момент текст внутри iframe - PullRequest
2 голосов
/ 17 октября 2011

У меня есть расширение Google Chrome на основе JavaScript, которое принимает в качестве входных данных выбранный в данный момент текст на веб-странице, а затем переводит этот текст на английский язык. Исходный текст заменяется переведенным текстом в той же позиции ...

У меня есть требование, чтобы некоторые сайты отображались в iframe, и для этих сайтов я также хочу перевести выбранный в данный момент текст в iframe.

Исходный код в начале расширения, где он получает текущий выбранный текст, приведен ниже -

var selection = document.getSelection();
var range = selection.getRangeAt(0);

Как мне изменить приведенный выше код / ​​добавить некоторый код, чтобы переменная 'selection' могла сохранять либо текущий выбранный текст в главном окне, либо текущий выбранный текст в iframe? Также переменная 'range' должна быть правильно инициализирована, даже если переводимый текст находится в пределах iframe ...

Кроме того, после завершения перевода текст на языке оригинала заменяется переведенным текстом в том же месте на веб-странице, переменная «замена» хранит переведенный текст -

    var holder = document.createElement('span');
    holder.innerHTML = replacement;
    var child = holder.firstChild;
    var ref = child.cloneNode(true);
    // ... now insert into document in place of the original content:
    range.deleteContents();
    range.insertNode(ref);
    while (child = child.nextSibling) {
      ref.parentNode.insertBefore(child.cloneNode(true), ref.nextSibling);
      ref = ref.nextSibling;
    }

Обратите внимание, что код для инициализации 'range' приведен в первом разделе кода, показанном в этом вопросе ...

Как мне изменить указанный выше код, чтобы новый элемент span создавался в iframe? Я понял, что для этого ключевой частью является код

 var holder = document.createElement('span');

Переменная 'holder' должна также иметь возможность создавать элемент span в iframe ...

Как мне изменить этот код?

1 Ответ

0 голосов
/ 17 октября 2011

Вы должны ссылаться на документ iframe вместо текущего основного document, оттуда вы можете определить, какой текст на самом деле выделен.

function getIFrameDocument(iframe) {
    var doc;
    if (iframe.contentDocument) {
        doc = iframe.contentDocument;
    } else if (iframe.contentWindow) {
        doc = iframe.contentWindow.document;
    } else if (iframe.document) {
        doc = iframe.document;
    } else {
        doc = window.frames[iframe.id].document;
    }

    return doc;
}

// try to get main document selection
var selection = document.getSelection();
if (!selection) {
    selection = getIFrameDocument(document.getElementById('your-iframe-id')).getSelection();
}

обратите внимание, что это не проверено, но идея имеет смысл.

...