tinymce.selection.setContent вставляет текст в начале текстовой области в IE - PullRequest
6 голосов
/ 29 декабря 2011

Я создал плагин для tinyMCE для вставки в редактор математических формул с использованием MathJax.Этот плагин открывает всплывающее окно в iframe (используя jQuery), а затем запускает событие триггера on для вставки введенной формулы в активный редактор tinyMCE.

Мой код работает в Chrome & Firefox правильно (создает pre, который вставляется в позицию курсора текстовой области), но в IE текст вставляется в начале текстовой области.

Я использую метод setContent, например:

tinyMCE.activeEditor.selection.setContent(text to insert, {format: 'bbcode'});

Я пытался использовать ed.focus() перед вставкой и другие рекомендации, найденные в StackOverflow, но у меня ничего не получалось.

Также я пытался сохранить позицию каретки перед открытием всплывающего окна и восстановить ее при вставке, но не смогработать в любом случае.

Есть идеи?

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 30 декабря 2011

РЕШИТЬ:

Я знаю, что это не самое элегантное решение, но оно работает для меня.

Перед открытием всплывающего окна я вставляю "span" с определенным идентификатором, например:

var sel = tinyMCE.activeEditor.selection;
sel.setContent('<span id="_math_marker">&nbsp;</span>');

Затем, когда всплывающее окно закрывается и текст отправляется обратно в редактор, я ищу диапазон с маркером, затем выбираю его и вызываю setContent:

var ed = tinyMCE.activeEditor;
var marker = ed.dom.get('_math_marker');
ed.selection.select(marker, false);
ed.selection.setContent("TEXT TO INSERT");

Это работает для всех браузеров! Не забудьте удалить промежуток, если всплывающее окно закрыто, не вставляя ничего, чтобы не оставить мусор в редакторе.

: -)

1 голос
/ 22 мая 2013

В IE8 нельзя получить активный редактор, поэтому нужно сосредоточиться, поэтому используйте

tinyMCE.activeEditor.focus ();

Надеюсь, он работает для вас.

1 голос
/ 03 августа 2012

Просто удалите часть .selection, чтобы ваш код выглядел как

tinyMCE.activeEditor.setContent(text to insert, {format: 'bbcode'});

0 голосов
/ 30 декабря 2011

Привет! Я использовал один из плагинов jQuery под названием jCaret для подобных ситуаций.Отлично работал в большинстве обычно используемых браузеров (IE 7,8,9 с режимом совместимости).

Посмотрите примеры, приведенные в ссылке ниже

jCaret

Спасибо

0 голосов
/ 29 декабря 2011

Попробуйте что-то вроде этого:


var myField = tinyMCE.get("SMSBody");

    //IE support
   if (document.selection) {

         myField.focus();
         sel = document.selection.createRange();
         sel.text = fieldName;
    }
else if (document.getSelection) {

         tinyMCE.activeEditor.selection.setContent(fieldName);
         myField.focus();
    }

Надеюсь, у вас это получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...