Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   установка позиции курсора или выделения в iframe (https://javascript.ru/forum/events/2775-ustanovka-pozicii-kursora-ili-vydeleniya-v-iframe.html)

mister_maxim 09.02.2009 17:21

установка позиции курсора или выделения в iframe
 
Вложений: 1
Здравствуйте, народ!
Что делаю:
Текстовый редактор в DHTML.
Проблема у меня следующая:
В Internet Explorer 6 пропадает выделение и курсор текста в iframe с параметром designMode='on' при потери фокуса этого внутреннего фрейма. При программной установки фокуса на фрейм курсор оказывается в начале.
Потеря фокуса происходит при щелчке на каком либо инструменте в панели инструментов, которая расспологается вне внутреннего фрейма.
Задача:
Сделать так чтобы восстанавливать позицию текстового курсора и выделения программно после щелчка на инструменте. Т.е. поставить фокус на iframe а затем восстановить позицию.
ps:
1. Во вложении помещен простейший пример на котором мне надо решить проблему.
2. Позиция текстового курсора и выделение восстанавливается автоматически при установки фокуса на внутренний фрейм в других браузерах. Это заморочка только лишь для ИЕ но его мне как веб-разработчику нельзя игнорировать, так как этот бразуер хоть и самый нелогичный, но увы - самый расспространенный.
3. Я долго пытался найти в коде редактора Tiny этот механизм, но увы.. кода много и отследить не получилось.
4. Я также пролазил по поисковикам, но бесполезно - везде пишут об этой задачи, но для input и textArea я пробывал эти же скрипты применить к iframe с параметром designMode='on' - не прошло.
5. Была идея даже отказаться от designMode='on' в ифрейме и использовать textArea c contenteditable, но сказано что все таки предпочтителен именно iframe c designMode='on' для поддержки древних браузеров и Tiny кстати так сделан.
6. Есть на худой конец еще извращенческий вариант - засунуть в iframe textArea и в нем редактировать текст, но не хочется извращаться, и в Tiny такого извращения нет.
7. Желательно научиться считывать выделения и позицию текстового курсора а также устанавливать, даже если можно решить эту проблему без этих действий.
Благодарю заранее за помощь и даже за мысленную попытку помочь ;)

IIIEPJIOK 10.02.2009 17:14

если, нет серьезных оснований делать из дива - кнопочку, и можно использовать в качестве кнопки - КНОПКУ(<input type="button">), то вопрос снимается автоматически :)
Код:

<html>
  <body id="body" onload="document.getElementById('ifr').contentWindow.document.designMode='on'">
    <input type="button" onclick="alert(document.getElementById('ifr').contentWindow.document.selection.createRange().text)">
    <iframe id="ifr" frameborder="1"  src="1.txt"></iframe>
  </body>
</html>


mister_maxim 11.02.2009 09:36

Благодарю за решение, IIIEPJIOK, я попробую :), во время наведения можно же и динамически поверх дива подставлять кнопочку, прозрачную только.. вообщем попробую :)

mister_maxim 25.02.2009 16:19

Нашел хорошее решение.
 
Вложений: 1
Получилось все ж таки!!! :))) О как я рад!
В Ие надо использовать методы:
var rangeMark = rang.getBookmark();
и
rang.moveToBookmark(rangeMark);
и в конце rang.select();
выделенной области:
document.selection.createRange();
простейшая реализация во вложении: select.zip

valenok2003 16.04.2009 11:46

Что-то я не понял, в первом примере выделение действительно исчезает, но курсор в первой позиции не появляется, он просто исчезает. Во втором случае происходит то же самое. Можете пояснить? Пробовал в ИЕ-7 и Опера 9

mister_maxim 18.04.2009 10:43

Здравствуй, valenok2003.
Здесь рассматривается устранение глюка именно браузера ИЕ, в частности я работаю в ИЕ6, на ИЕ7 этот пример не проверял. В Опере и в Файрфоксе таких проблем нет, там выделение не теряется, только лишь фокус поставить требуется.
Кстати, по результатам доработки текстового редактора я понял, что дело было не в методах
moveToBookmark
и
getBookmark
они как раз таки вредят в некоторых местах(не помню в каких, помню, что как их убрал - какой-то баг исчез), их можно (даже нужно) убрать, а выделение сохраняется в ИЕ сохранением и установкой объекта rang. Так что можете просто убрать в том моем примере: var rangeMark = rang.getBookmark(); и rang.moveToBookmark(rangeMark); будет тот же эффект - сохраняться выделение в ИЕ6.


Часовой пояс GMT +3, время: 22:20.