Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как переместить курсор к HTML элементу в FF? 
V
    Опции темы
BuTbKa_ua
Дата 2.10.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Всем доброго времени суток. Нужно переместить курсор в IFrame c designMode=on. 
В IE это делается так : 
Код

 Cursor.prototype.focus = function () {
    var range = this.doc.body.createTextRange();
    range.moveToElementText(this.start || this.container);
    range.collapse(!this.start);
    range.select();
  };


this.doc - объект document окна
this.container - объект body 
this.start - объект куда переместить курсор.

Этот метод работает прекрасно в IE, в FF используется другой код, но он не всегда работает корректно:

Код

Cursor.prototype.focus = function() {
    var range = this.win.document.createRange();
    range.setStartBefore(this.container.firstChild || this.container);
    if (this.start)
      range.setEndAfter(this.start);
    else
      range.setEndBefore(this.container.firstChild || this.container);

    range.collapse(false);

    var selection = this.win.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
  };


Как заставить правильно перемещаться курсор к нужному объекту в  FF?

Это сообщение отредактировал(а) BuTbKa_ua - 2.10.2007, 13:38
PM MAIL   Вверх
cruelangel
Дата 2.10.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



range.selectNodeContents( this.start || this.container );
range.collapse(false);

PM MAIL   Вверх
BuTbKa_ua
Дата 2.10.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Цитата(cruelangel @ 2.10.2007,  13:56)
range.selectNodeContents( this.start || this.container );
range.collapse(false);

неа, тот же результат - курсор в начале окна. this.start - определен и указан верно. Может это из-за того, что я вставляю код в BODY через innerHTML?
PM MAIL   Вверх
AKS
Дата 2.10.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



BuTbKa_ua, вообще-то установить диапазон можно, используя методы setStart/setEnd. Зачем Вы пытаетесь установить начало текстового диапазона перед нужным элементом (setStartBefore)?
PM MAIL   Вверх
BuTbKa_ua
Дата 2.10.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Не мой код ) Моя задача модернизировать существующий SyntaxHighlight редактор. 
Я с Range и Selection никогда не сталкивался, для меня это пока что нечто новое.
Сейчас попробую по вашему совету переписать, посмотрю что получится.
PM MAIL   Вверх
cruelangel
Дата 2.10.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



> this.start - определен и указан верно.

сомневаюсь

> Может это из-за того, что я вставляю код в BODY через innerHTML? 

сомневаюсь

Добавлено через 1 минуту и 8 секунд
приведи более полный код...

Добавлено через 1 минуту и 44 секунды
что за редактор? 
PM MAIL   Вверх
BuTbKa_ua
Дата 2.10.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



2cruelangel

Код

undo: function () {
        if (this.currHistoryPosition > this.history.length-this.historySize){
            this.currHistoryPosition--;
            var obj = this.history[this.currHistoryPosition];
            if (!obj){
                return ;
            }
            this.container.innerHTML = obj.code;
            var cursor = new Cursor(this.container);
            cursor.start = this.win.document.getElementById('cursor').nextSibling;
            cursor.focus();
        }
},


вот тут и вызывается cursor.focus(), а строкой выше определяется cursor.start, повторяю в IE работает в FF нет. грешу на метод Cursor.focus
я в нем дебагил this.start - объект определен и определен верно. не получается курсор передвинуть на этот элемент.
PM MAIL   Вверх
cruelangel
Дата 2.10.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



а что в консоли ошибок?
PM MAIL   Вверх
BuTbKa_ua
Дата 2.10.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



ничего, в том то и дело
PM MAIL   Вверх
cruelangel
Дата 2.10.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



а после undo с домом что-нибудь делается?
PM MAIL   Вверх
BuTbKa_ua
Дата 2.10.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



нет, только если вводить текст
PM MAIL   Вверх
BuTbKa_ua
Дата 10.10.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Вопрос так и не решил. Написал небольшой файл для примера, все равно не хочет работать в FF
в IE рабтает идеально. Код привожу ниже, попробуйте кто-нибудь у себя в FF может у меня браузер глючит

Код

<html>
<body>
<script>
    var ua = navigator.userAgent;
    var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
    var editor = '';
    function init(){
        editor = document.getElementById('editor');
        editor.win  = editor.contentWindow;
        editor.doc  = editor.win.document;
        editor.doc.designMode = 'on';
        editor.doc.open();
        editor.doc.write ("<html><body><span id='1'>ID=1</span><br /><span id='2'>ID=2</span> ||| <span id='3'>ID=3</span></body></html>");
        editor.doc.close();
    }
    function focusWin (id) {
        editor.win.focus();
        var focusObject = editor.doc.getElementById(id);
        if (isMSIE){
            var range = editor.doc.body.createTextRange();
            range.moveToElementText(focusObject);
            range.collapse(false);
            range.select(); 
        }else{
            var range = editor.doc.createRange();
            range.selectNodeContents(focusObject);
            range.collapse(false);            
        }
    }
    window.onload = function (){init();};
</script>
    <input type=button onclick="focusWin(1);" value="ID=1">
    <input type=button onclick="focusWin(2);" value="ID=2">
    <input type=button onclick="focusWin(3);" value="ID=3">
    <iframe id="editor"></iframe>
</body>
</html>

PM MAIL   Вверх
cruelangel
Дата 10.10.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



у меня на второй лисице выдаёт ошибку 
Цитата
Object cannot be created in this context" code: "9
 и во фрейме ничего не появляется.

Это сообщение отредактировал(а) cruelangel - 10.10.2007, 18:42
PM MAIL   Вверх
BuTbKa_ua
Дата 10.10.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



У меня ничего не выдает (
В какой строке хоть?
PM MAIL   Вверх
cruelangel
Дата 10.10.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



нивкакой smile но эксперименты показали, что по вине doc.open
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3129 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.