| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Наши скрипты > Как вставить текст под курсором |
| Автор: Sardar 27.11.2004, 18:58 | ||
| Вопрос: Как вставить текст под курсором. Столкнулся сегодня с этой задачей, решил ответить на него один раз с рабочим кодом. Надеюсь больше этот вопрос не всплывёт В разных браузерах по разному можно узнать где находится каретка в текстовом поле. Точнее только в Мозилле на данный момент есть возможность узнать положение каретки опрашивая поля:
В ИЕ есть полезный обьект document.selection который может достать нам обьект DOM'овский обьект(ну почти DOM'овский Селекция здесь в самом широком смысле! То есть мы можем таким же образом работать над всем содержимым страницы. В Опере код работать не будет, по старинке текст добавляется в конец. Следующая сложность это не потерять селекцию(положение курсора) при клике на внешний элемент. Будем отлавливать события потери фокуса, клика и т.д., записывать "позицию курсора" и использовать её когда нужно. В моём коде есть потенциальная ошибка: если отселектировать текст, затем кликнуть где нибудь по странице, а затем по кнопке вставляющей новый текст, то он будет вставлен в записанную позицию, что не совсем верно - селекция должна исчезнуть если кликаем не по кнопке. Решается отловом событий на body и сбросом записанной селекции, но это по вкусу Код с коментариями:
|
| Автор: Alx 28.11.2004, 01:46 |
| аааааааа Sardar ты монстр! господи, я и не представлял, что эти чёртовы разные браузеры могут делать из одной простой функции в ИЕ такую туеву хучу всякого кода! |
| Автор: Sardar 28.11.2004, 02:23 |
| Кода на самом деле не много(подсветка убила форматирование), просто возможности чуть шире Забываем о текстовом поле, создаем обьект и работаем с созданным обьектом. Смотри пример, запусти. |
| Автор: Black 17.12.2004, 20:57 | ||
| ALEXANDRO где Сардар подвел итог я не нашел зато сделал что хотел :-) набо было то всего:
вот что я хотел |
| Автор: Sardar 18.12.2004, 01:03 | ||
| PHP-DIRECTOR если не понял, значит удалять ничего не буду... Поделим мир на 3 части:
Также нужно запоминать позицию курсора при потере фокуса, ведь если ты кликнешь на кнопку, то фокус с текстового поля уйдёт Разбирай мой код, там сразу станет ясно Как его использовать:
|
| Автор: Aliance 24.3.2005, 01:16 |
| Sardar Огромное спасибо за данный код, это просто бестцеллер :-) 6 с половиной баллов |
| Автор: Sardar 24.3.2005, 01:20 |
| Aliance на логе по аське можно создать небольшой мануал, а то вижу народу не ясно Скинь ссылки на примеры что наверстали, будет интересно. А вообще надо смотреть исходник в новом дизайне, там многие фичи включая эту используются. Ждём когда его введут |
| Автор: Aliance 24.3.2005, 03:14 |
| Не хотел радовать преждевременно, но завтра (точнее уже сегодня, но после ночи) я как раз собирался выложить готовый пример, с комментариями. без лишнего мусора. |
| Автор: sergejzr 24.3.2005, 03:28 |
| Новая Опера включена? |
| Автор: Sardar 24.3.2005, 03:48 |
| Опера вроде бы обьект selection поддерживает, следовательно должно работать, если они от поведения ИЕ не отклонялись. В любом случае надо потестить. |
| Автор: Aliance 24.3.2005, 12:20 |
| Пример тут: http://files.vingrad.ru/Aliance/bbcode.html |
| Автор: sergejzr 24.3.2005, 13:32 | ||
Блин! Эта Опера опять выделывается...
У меня к сож времени нету разбираться |
| Автор: Sardar 24.3.2005, 17:55 |
| Очень странно, как будто TextRange.parentElement не поддерживается... Поставлю у себя этого зверя, пофиксю, в новом скине этот код применяется... ведь обещали нормальную поддержку... На opera.com последняай документация на версию 7, о 8 только реклама... |
| Автор: sergejzr 31.3.2005, 03:22 |
| Я перенял твой код и у меня с ним Опера работает... http://www.iwi-iuk.org:8081/tex/index.php |
| Автор: Aliance 1.4.2005, 18:42 |
| А функция «Быстрой цитаты» работает по этому же коду/принципу? |
| Автор: sergejzr 1.4.2005, 18:52 | ||
С ие и мозиллой он всегда работал. проблема только с Оперой
Нет, когда сделали сперва, то всем ужастно не понравилось, что цитата в курсор вставлялась. Было очень неудобно. Добавлено @ 18:57 http://forum.vingrad.ru/index.php?showtopic=32152&hl= Где то здесь обсуждали |
| Автор: Aliance 1.4.2005, 19:09 | ||
А как тогда сейчас? Впринципе, различие там только в том, чтобы только отселектрированный текст вставлять... |
| Автор: sergejzr 1.4.2005, 19:11 |
| Value+=цитата |
| Автор: Sardar 1.4.2005, 20:41 |
| sergej.z, а я цитату в новом дизайне под курсором вставляю, нужно исправить... |
| Автор: Aliance 1.4.2005, 21:07 | ||
А чего так? =/ |
| Автор: sergejzr 1.4.2005, 21:10 | ||||
Вот, нашёл http://forum.vingrad.ru/index.php?showtopic=29258&unread=1&hl=
Как видишь... |
| Автор: Wolf1994 1.8.2005, 15:17 | ||||
| Что-то я не смог разобраться с установкой примера, предложенного Sardar'ом, под IE 6. В JavaScript я разбираюсь плохо, поэтому не смог проанализировать код. Как мне кажется, не записывается позиция курсора - вставка у меня осуществляется в конец текста. Возможно я что-то не так сделал, тогда, пожалуйста, подскажите - что? Файл HTML:
Файл "insert.js":
|
| Автор: Aliance 15.8.2005, 19:28 | ||
|
| Автор: -NIK- 4.11.2005, 12:28 | ||
эм, я очень слаб в JavaScript, это только для IE? Если да, то имхо есть вариант легче.
А готового кода для Мазиллы нет? Мне очень нужно, самому разобраться не получается. Помогите пожалуйста! |
| Автор: sergejzr 4.11.2005, 13:13 |
| -NIK-, Sardar "только для ИЕ" не пишет |
| Автор: Aliance 4.11.2005, 13:21 |
| Автор: Alx 21.1.2006, 16:57 |
| я вот чего не понял. мы в мозилле, когда хотим заменить выделение, мы делим на три части, потом заменяем среднюю часть, опять соединяем в одну часть и полностью заменяем на неё содержимое инпута? |
| Автор: Alx 21.1.2006, 17:56 |
| ок, спасибо. решений для других браузеров, кроме IE и Firefox так и нету, да? |
| Автор: sergejzr 21.1.2006, 18:22 |
| решение Сардара работает н всём, кроме оперы <8.0 (для старых опер решения нет. программисты там - пофигисты |
| Автор: 3,14 11.4.2006, 17:46 |
| У меня не работает в IE (пишет object doesn't support this property or method), если выделение текста в textarea сделать двойным кликом. IE Version: 6.0.2900.2180.xpsp_sp2_gdr.050301-1519 |
| Автор: SANCHOS 19.5.2006, 18:51 | ||
А чем вам не нравится более простой вариант для этого действия?
text1,tex2,text3 можно заменять чем угодно. |
| Автор: godsgame 3.9.2006, 17:32 | ||||
| ммм.. потратил много времени пытаясь подключить эти ф-ции... Сначала получал ошибку Object not defined/expected или что-то в этом роде... потом решил для начала просто подключить файл.. Получил ошибку: Syntax Error on line 94 подключаю так:
файл:
Я даже закоментил ОНЛОАД... но и это не помогло. Помогите пожалуйста разобраться... ЧЯто-то мне подсказывает что у меня руки кривые. |
| Автор: godsgame 3.9.2006, 17:51 | ||
нашел ответ тут:
спасибо Ciber SLasH ! |
| Автор: GZep 11.2.2007, 21:55 | ||||||
| Sardar, ваш вариант немного не верен... Вот кусок вашего кода:
Тогда как вместо него надо:
Все дело в том, что mac версия ИЕ поддерживает document.selection, но не поддерживает document.selection.createRange Вот так вот. Теперь попрошу кого-нибудь помочь мне со своим кодом: (пример Sardar'a мне не подходит) Собственно, что не работает: Все прекрасно работает кроме изменения позиции курсора в ИЕ(у меня стоит 7-я финальная версия)... С остальными браузерами все просто отлично. Вот код(прямо копируйте и вставляйте в файл для запуска, форма, кнопки и т.д. уже имеются):
Помогите пожалуйста! Не знаю, почему этот ие не хочет никак курсор двигать, ни в какую... |
| Автор: Sardar 12.2.2007, 00:28 |
Да там многое что нужно переделывать, добавлять поддержку множественных селекций и прочее. Руки не дойдут, пока у себя где не запользую, не сдвигаеться с места. Коллапсировать селекцию это прировнять начало к концу или конец к началу, смотря какое направление. Следовательно если передвинуть конец и сколлапсировать селекцию, то передвинем курсор куда нужно. В твоём случае двигаем только если текста в селекции не было, следовательно достаточно только cursor.moveEnd("character", -close.length);. На одном поле может быть масса селекций, это такие хендлеры по тексту, помогающие изменять его в некотором месте. Селекция на экране это нечто другое, она обычно одна. Вызовом .select() мы переносим селекцию на экране под конкретную селекцию в скрипте. Короче что бы курсор реально передвинулся |
| Автор: GZep 12.2.2007, 16:25 | ||||
А cursor.moveStart в моем случае можно не вставлять? Это потому что отсутствует выделение, а имеется только позиция курсора? А как тогда поставить курсор в ие в самый конец строки? Не выделенной части а всей строки целиком...
Эта такая особенность в ие? А вот еще проблема появилась:
Почему так? |
| Автор: Sardar 12.2.2007, 17:54 | ||||
Если не нужно ставить курсор, то не нужно, но тогда и .select() убери. "Курсор" == селекция с нулевой длинной.
Читай абзац выше. Отселектировать всё что нужно, сколлапсировать в начало или в конец. Можно и move(End|Start) использовать. Только не забудь .select() на конце, что бы реальная селекция на экране изменилась. Нет, это http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_selection.asp?frame=true. Потому что после установки текста селекция всегда коллапсируется. Сделай с неё дубликат, он по моему не должен изменяться. Хотя у ИЕ с дубликатами глюки есть, можно двигать концы одной селекции, а дубликат "магическим способом" тоже будет изменяться. Больше на эту тему в основном разделе о indent'aх в питоне, фича к форумскому полю ответа по ctrl+[]. |
| Автор: GZep 12.2.2007, 20:11 | ||
Вот я как раз это и применял, только толку без .select() не было. Вот в этом, наверное, и была вся проблема. Вот я там был
Спасибо, буду копать, думаю, скоро разберусь и выложу тут как сделать. Sardar, Даже не знаю, что сказать. Такая помощь! Да чтобы я без Вас делал! Да, наверное позже выложу свой универсальный вариант, который, думаю, многим понравиться. |
| Автор: GZep 13.2.2007, 15:11 | ||
Sardar, помогите, пожалуйста, не работает. Вот пример использования: [только_что_вставленный_тег][текст][/только_что_вставленный_тег][курсор] - все правильно, мне так и надо! [только_что_вставленный_тег][текст][/только_что_вставленный_тег][курсор][предыдущий_тег][текст][/предыдущий_тег] - нет, мне надо, чтобы курсор в самом конце стоял! По-моему надо расширить конечную точку селекции до конца формы ввода, чтобы добиться нужного результата... Только вот не получается... Вот что нахимичил...:
Это только кусок, естественно, кода. |
| Автор: Sardar 14.2.2007, 17:21 |
| Не знаю зачем ставить курсор всегда в конец поля, но можно просто отселектировать всё содержимое и коллапсировать селекцию в конец. Обернуть поле в селекцию можно методом http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/movetoelementtext.asp. |
| Автор: GZep 17.2.2007, 21:34 | ||
Вот так, вроде, должно работать, но опять
Просто на самом деле уже интересно: получится так сделать или нет. Sardar, посмотрите, пожалуйста, что там не так? |
| Автор: Sardar 17.2.2007, 22:28 | ||
Это вообще откуда? Как end вычислил? И вообще зачем, если ты уже отселектировал всё. Я сказал коллапсировать, т.е. .collapse(true) |
| Автор: GZep 18.2.2007, 12:21 | ||
| Sardar, спасибо, получилось Описание кода:
Sardar, посмотрите, пожалуйста, кроссбраузерный ли этот код? |
| Автор: Sardar 18.2.2007, 14:42 |
Вроде кроссбраузерный. Есть пара замечаний:
|
| Автор: Rigel 24.7.2007, 11:05 |
| Получается замечательно, но переход курсора в конец текста не всегда удобен - лучше бы он оставался приблизительно на месте редактирования - только вот никак не придумываетсяЮ как бы это сделать. |
| Автор: gridis 9.2.2008, 19:27 |
| Sardar, здравствуйте, у меня такой к Вам вопрос.... Мне вашь пример очень понравился.... только у меня такая проблема.... мне нужна вставка HTML кода под курсором... в опере и файрфоксе я нормально вставляю через EditField.execCommand('inserthtml',false, ""); ИЕ такой функции нет..... |
| Автор: Sardar 10.2.2008, 02:30 |
| Получили селекцию, меняем содержимое через http://msdn2.microsoft.com/en-us/library/ms536656.aspx(html) |
| Автор: introtel 1.6.2009, 14:28 |
| спасибо за код. вопрос: а что делать если надо вставить текст под курсором. не ЗАМЕНИТЬ отселектированный текст, а как-то запомнить позицию курсора. в фф это можно а как быть с ИЕ? |
| Автор: GogElf 17.7.2009, 00:58 | ||||||
| Сам я не местный Я не очень много понимаю в javascript (ну на стадии что-то сломать). Меня очень напрягает писать id и по ним чтоб код работал. В общем кому хочется сделать 1 панельку с кнопками на 2-3 или более полей то заменяем:
на
И вписываем onclick
|
| Автор: maxipub 31.3.2011, 21:48 | ||||||
| Тема прикреплена... она еще жива? Заметил странный баг в оригинальном скрипте. FF 3.6.13
Оригинальный код, просто с прописанными данными для textarea. Если выделить мышкой несколько строк, но так, чтоб одна из строк была выделена не полностью, например:
После клика по "Test" будет выполнена некорректная ставка. При выделении мышкой в FF у меня все корректно работает только если выделена лишь часть одной строки, либо несколько строк, но полностью. В общем, очень жаль, наработка вроде ничего, но работает почему-то некорректно. Судя по всему, что-то с обработкой событий. ЗЫ: вот и в IE 8 тоже нашел небольшой баг, но это еще терпимо. К примеру, выделяем строки:
После клика по "Test" будет выполнена корректная ставка, но с некорректным выделением (что выделяется - указано жирным): [test]3 qwerty asdfgh zxcvbn 4 qwerty asdfgh zxcvbn 5 qwerty asdfgh zxcvbn 6 qwerty asdfgh zxcvbn 7 qwerty asdfgh zxcvbn[/test] Т.е. он начало выделения смещает на минус (количество переводов в выделенной строке - 1). Как убрать эти баги? Особенно первый. Или подскажите альтернативу. Сам писал-писал, не вышло. Другие варианты смотрел - не подходят. Необходимо чтоб после вставки текста под курсор, texarea всегда подскролливался к курсору (к месту вставки). Только чтоб без лишних библиотек и наворотов. Обычная же вещь, с чего сложности? Заранее благодарю! |
| Автор: maxipub 31.3.2011, 23:14 |
| Если не понятно о чем речь, могу снять видео и выложить чтоб быстрее было. Кстати, тут на форуме прогеров (хе-хе |
| Автор: TsibaSasha 6.3.2012, 03:05 |
| Браво Уважаю, столько сил и терпения надо иметь, что бы написать такой код для форума) |
| Автор: Sanchezzz 17.9.2012, 12:52 |
| Предлагаю свое решение с использованием плагина caret Пощупать можно http://jsfiddle.net/VduMQ/1/ |