Вставка текста в редактируемый кадр в позиции каретки (IE) - PullRequest
4 голосов
/ 17 марта 2011

Я борюсь с действительно простой проблемой: в Internet Explorer я хочу вставить обычный текст в текущей позиции каретки.Это очень хорошо работает для простых элементов TEXTAREA, но не совсем работает для редактируемых IFRAME, что я и имею.

В скрипте, который я использую, я создаю объект TextRange из документа IFRAME, который я использую для вставки текста в качестве HTML в позиции курсора.

<iframe id="editable">
  <html>
    <body>
      Some really boring text.
    </body>
  </html>
</iframe>
<script type="text/javascript">

    window.onload = function() {
        var iframe = document.getElementById('editable');
        var doc = iframe.contentDocument || iframe.contentWindow.document;

        doc.body.innerHTML = iframe.textContent || iframe.innerHTML;

        // Make IFRAME editable
        if (doc.body.contentEditable) {
            doc.body.contentEditable = true;
        } 
    }

    function insert(text) {
        var iframe = document.getElementById('editable');
        var doc = iframe.contentDocument || iframe.contentWindow.document;
        iframe.focus();
      if(typeof doc.selection != 'undefined') {
            var range = doc.selection.createRange();
            range.pasteHTML(text);
      }
}
</script>
<input type="button" value="Insert" onClick="insert('foo');"/>

Когда я выбираю некоторыетекст в IFRAME, выбор будет заменен на «foo» - это ожидаемое поведение.Но когда я просто помещаю курсор в какое-то место текста, вставка не сработает.

Это обычное поведение, так как для случая, когда я просто помещаю курсор куда-то или нет, "нет реального выбора"это ошибка с редактируемыми IFRAME в IE, так как она довольно хорошо работает с простыми элементами TEXTAREA?

Есть ли обходной путь?

1 Ответ

6 голосов
/ 17 марта 2011

Вы можете найти, что это работает, если вы используете onmousedown вместо onclick в своей кнопке.

UPDATE

Причина, по которой это имеет значение, заключается в том, что событие click срабатывает после того, как iframe потерял фокус (что разрушает свернутый выбор в IE), тогда как mousedown срабатывает раньше.

ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ

Вы также можете попробовать исправить это в IE, сохранив / восстановив выбранный TextRange, поскольку фрейм iframe теряет / получает фокус. Примерно так должно работать:

function fixIframeCaret(iframe) {
    if (iframe.attachEvent) {
        var selectedRange = null;
        iframe.attachEvent("onbeforedeactivate", function() {
            var sel = iframe.contentWindow.document.selection;
            if (sel.type != "None") {
                selectedRange = sel.createRange();
            }
        });
        iframe.contentWindow.attachEvent("onfocus", function() {
            if (selectedRange) {
                selectedRange.select();
            }
        });
    }
}

window.onload = function() {
    var iframe = document.getElementById('editable');
    fixIframeCaret(iframe);
};
...