| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Наши скрипты > Вставка текста под курсором - 2 |
| Автор: Black 18.6.2005, 02:46 | ||
Скрипт вставки текста под курсором:
Просьба протестировать скрипт в Opere ниже 8 версии. Работает в IE, FireFox, Opera 8. Лучше всего работает в FireFox, затем IE, Opera. В Opera бывают глюки. Пример и инструкции по использованию в прикреплённом файле. Если будете использовать скрипт в ваших проектах желательно сохранять копирайт или хотя бы меня известите. Жду предложений по усовершенствованию скрипта |
| Автор: Sardar 18.6.2005, 21:31 | ||
Очень полезное замечание, на досуге подправлю свой код, вероятно это и есть причина глюков в Опере. Кстати, ты забыл для ИЕ при потере фокуса сохранять селекцию. Например что бы на форуме выделить цитату участника, затем нажать на кнопку и получить на место где раньше был курсор. |
| Автор: sergejzr 18.6.2005, 21:36 | ||
Там такое вообще не работает selection заработал только в 8 версии. |
| Автор: Black 19.6.2005, 00:23 | ||||||
Sardar
кстати, я не пойму как это сделать. Дай подсказку Вот альтернативный скрипт:
Но вот проблема. Стоит вместо <textarea></textarea> поставить input и Opera начинает ставить текст в конец, а не под курсор. Кто может это объяснить??? Вот также пытаюсь сделать эмуляцию selectionStart/selectionEnd в Internet Explorer:
Если в <input type='text' value=''> поставить курсор, то его позиция записывается в selection Это даёт нам возможность осуществлять вставку данных под курсор. Например: document.selection.createRange().text += NeedText; Но вот если в этот же <input type='text' id='sss'> вставить данные таким образом: document.getElementById('sss').value='ля-ля'; то в этом случае позиция selection теряется и курсор перемещается в конец текстового поля. Интересно, нельзя ли как-нибудь отслеживать позицию selection (сохранять ее) и в случае вставки данных в текстовое поле через document.getElementById('sss').value возвращать позицию в нужное нам место. При этом я понимаю надо действовать так. Извлечь сохраненную позицию selection прибавить к ней длину вставленной строки через document.getElementById('sss').value и установить курсор в это место. Вот как самому передвигать курсор в текстовом поле на нужное кол-во символов я не могу понять . Как я понял Sardar'y удалось сохранить положение курсора. Вот теперь бы суметь его двигать. после строки str.value = str1 + ' ' + text + ' ' + str2; курсор уходит в конец текстового поля. Я хочу его вернуть в нужное мне место, то есть как будто произошел простой: document.selection.createRange().text += NeedText; Т.е. курсор надо вернуть назад на определенное кол-во символов, которое зависит от длины вставленной строки. Например, это делается в Mozilla с помощью: str.selectionStart = str.selectionEnd = позиция курсора; где str нужное нам текстовое поле. Жду комментариев |
| Автор: Black 19.6.2005, 14:45 | ||||
Вот доработал скрипт:
вот это я не придумаю как сделать :-) Я так понимаю надо делать duplicate(), то вот на каком событии. У меня с дупликатом получаются вообще глюки Вот если бы суметь при потере фокуса сохранять селекцию в IE, то все будет GOOD. И скрипт будет то что надо |
| Автор: Sardar 19.6.2005, 15:07 | ||
Вот ты и сам ответил на свой вопрос А если ещё и на функцию _textareaSaver здесь посмотришь: http://forum.vingrad.ru/index.php?showtopic=35775 то вопроса не будет |
| Автор: Black 19.6.2005, 15:32 | ||||||
| Сделал так: изменил эту функцию:
а в функцию InsertText(text) добавил:
Но если человек уберет курсор из текстового поля и затем щелкнет по ссылке запустившей функцию InsertText(text) текст добавится куда надо (на то место где был курсор до потери фокуса с текстового поля), но.... но после этого курсор становится в самое начало текстового поля, а ведь должен стать после добавленного текста... в чем глюк. Что делаю не так??? Вот полный код:
|
| Автор: Black 19.6.2005, 16:52 | ||
| ФИНАЛЬНАЯ ВЕРСИЯ СКРИПТА
P.S: добавлена поддержка старых версий браузеров. Оптимизированна работа в браузере IE. Улучшена поддержка браузера Opera. Исправлены мелкие ошибки и недочеты Благодарю Sardarа за замечания. |
| Автор: Sardar 19.6.2005, 17:50 | ||
Замени на: if(str.tagName.toUpperCase()=="TEXTAREA") str.focus(); |
| Автор: Гость_Гость 29.8.2005, 09:28 |
| Огромное спасибо за замечательный скрипт! Все копирайты оставил. |
| Автор: Wolf1994 9.4.2006, 00:26 | ||
Слегка усовершенствовал скрипт под свои нужды. По-моему, стало чуть удобнее:
Изменил здесь: function position(name) { obj(name); Здесь: position(this.id); И здесь: function InsertText(text) { if (typeof(str)!="undefined") { Убрал это: onload='obj();str.focus();' И это: name = 'mess'; Теперь можно использовать этот скрипт для любого количества полей, не задавая иды этих полей. PS. Извините, если сделал элементарную вещь и отнимаю ваше время, но когда-то понять скрипт такого уровня для меня было недостижимо и я очень горд, что чему-то за это время научился и не могу не поделится |
| Автор: Wolf1994 9.4.2006, 02:37 | ||
Пожалуйста объясните, почему этот кусок кода вызывает глюки в IE (только в IE), при использовании textarea вместо input:
Ошибка: "Недопустимый аргумент". Для чего вообще нужен этот фрагмент? |
| Автор: Ciber SLasH 9.4.2006, 02:55 |
| Wolf1994, а ты удали эти строчки и тогда ошибки не будет. |
| Автор: Wolf1994 9.4.2006, 04:32 |
| Удалить-то я их удалил, но хочется понять - для чего это нужно? |
| Автор: Wolf1994 9.4.2006, 05:30 | ||||||||
Всё, разобрался. Эти функции создают две разбитых строки, чтобы для каждой из них определить - есть ли на концах пробелы. Мне обработка пробелов не нужна. Поэтому это тоже вырезаю:
Ещё один вопрос. Даже два. 1) Если в строку добавить символ возврата каретки "\n" - то будет ли он игнорироваться при вставке в "input"? 2) Как сделать определение - есть ли внутри вставляемого аргумента эти символы и отпозиционировать курсор после первого такого символа? То есть: [myquote]\nКУРСОР ЗДЕСЬ\n[/myquote] Если кто знает, то подскажите пожалуйста решения для всех браузеров! ))) Добавлено @ 05:39
Нашёл:
Последнее:
|
| Автор: Wolf1994 9.4.2006, 08:01 | ||
2) под FireFox:
|
| Автор: Wolf1994 9.4.2006, 16:59 |
| Ciber SLasH, спасибо. Жаль, что у меня так и не получилось найти решения с первым примером, для Opera и IE. Пожалуйста, подскажите как в этих браузерах управлять положением курсора. Просмотрел исходники этого форума, но так и не понял, как тут это реализовано |
| Автор: Pena 20.4.2006, 00:37 | ||
Несколько "не в тему", но не хочется засорять forum "новой темой" - мой вопрос не заслужевает этого
- Нужно чтобы 1) текст вставлялся не только в строку "aText", а в ту где находится курсор 2) выделенный в строке текст с обеих сторон "обставлялся" (без использования button) - хотя и прописано в коде, ан только с buttonom работает( З.Ы. Для вас семечки, а мне польза - не пойму по всем вашим росписям (см. выше) что к чему |
| Автор: Wolf1994 20.4.2006, 19:01 | ||||
Pena, вот финальный вариант моей модификации, который делает то, что Вам нужно:
В input или textarea вставляем это: onchange="position(this.id);" onclick="position(this.id);" onkeyup="position(this.id);" onfocus="position(this.id);" id="anyid" И, ставим, например такую ссылку: <a href='javascript:void(0)' onclick='InsertText("[MyQUOTE]\n\n[/MyQUOTE]")'>Цитата</a>
|
| Автор: Pena 21.4.2006, 00:47 |
| Э-э-эм... вторая строка вообще отказывается выделятся, и не происходит "обёртки" =( |
| Автор: Ciber SLasH 21.4.2006, 01:19 | ||
| Wolf1994, Pena, а чем вам не нравится скрипт Sardar-а: http://forum.vingrad.ru/index.php?showtopic=35775 В качестве демонстрации его скрпта:
|
| Автор: Pena 21.4.2006, 13:13 |
| В данном виде он не выполняет первое условие: "текст вставлялся не только в строку "aText", а в ту где находится курсор" =( З.Ы. Но выполняет второе - и за то спасибо) З.Ы.Ы. Вот бы доработать |
| Автор: rcdimon 5.5.2006, 07:01 | ||||
На что IE благополучно отвечает:
Почему? |