Так... Такая проблема... Попробывал пример товарища Fr-Ron'a заюзать. Если код в <head></head> - то работает. Если в <body></body> - То не в какую! Что делать? Вот приведите привер, как реализовать, чтобы текст вставлялся в форму: Code: <textarea type="text" rows=4 cols=40 name="text"></textarea> Которая находится внутри тега <body>. Буду очень благодарен.
Code: function smilie(thesmilie) { getActiveText(); var AddSmilie = " " + thesmilie + " "; AddText(AddSmilie); } function AddText(NewCode) { if (typeof(theform.message.createTextRange) != "undefined" && theform.message.caretPos) { var caretPos = theform.message.caretPos; caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? NewCode + ' ' : NewCode; caretPos.select(); } else if (theform.message.selectionStart || theform.message.selectionStart == '0') { // its mozilla and we'll need to re-write entire text var start_selection = theform.message.selectionStart; var end_selection = theform.message.selectionEnd; // fetch everything from start of text area to selection start var start = (theform.message.value).substring(0, start_selection); // fetch everything from start of selection to end of selection var middle = NewCode; // fetch everything from end of selection to end of text area var end = (theform.message.value).substring(end_selection, theform.message.textLength); theform.message.value = start + middle + end; setfocus(); theform.message.selectionStart = end_selection + middle.length; theform.message.selectionEnd = start_selection + middle.length; getActiveText(); AddTxt = ""; return; } else { theform.message.value += NewCode; } setfocus(); getActiveText(); AddTxt = ""; } <a href="#" onclick="smilie(';)'); return false;"><img src="images/smilies/smilehz.gif" alt="Wink" border="0" /></a> и тд наркоманское решение .. но все же =)
А что насчет бб-тегов из разряда [#quote]? Как определить - какой текст (а вернее какая его часть) выделен в textarea?
да, кстати, те скрипты, что оговаривались выше - будут вставлять смайл в конец сообщения, или в текущую позицию в тексте?
По поводу "наркоманского решения" br: Чет не вьехал в твоем коде вот в это: Code: theform.message.selectionStart = end_selection + middle.length; theform.message.selectionEnd = start_selection + middle.length; С такой реализацией начало выделения у тебя уползает от первоначального на middle.length символов вправо, что не есть гуд. Имхо нужно заменить на Code: theform.message.selectionStart = start_selection; theform.message.selectionEnd = start_selection + middle.length; Тогда выделенный текст будет заменяться на код смайла, и этот самый код будет выделяться. Еще на понятно, какими судьбами тут оказались: Code: setfocus(); getActiveText(); AddTxt = ""; Если действие setfocus() понятно по названию /привел бы код=)/, то что делает getActiveText() я вообще не вкурил, т.к. она не принимает никаких параметров, и , судя по всему, ничего не возвращает. А что такое AddTxt я и предполагать боюсь...
Мой вариант: PHP: <script> function insertSmilie(code) { var myTextArea = document.getElementById('message'); //IE support if (document.selection) { myTextArea.focus(); sel = document.selection.createRange(); sel.text = code; } //MOZILLA/NETSCAPE support else if (myTextArea.selectionStart || myTextArea.selectionStart == "0") { var startPos = myTextArea.selectionStart; var endPos = myTextArea.selectionEnd; var oldText = myTextArea.value; myTextArea.value = oldText.substring(0, startPos) + code + oldText.substring(endPos, oldText.length); myTextArea.selectionStart = startPos; myTextArea.selectionEnd = startPos + code.length; } else { myTextArea.value += code; } myTextArea.focus(); } </script> <textarea id="message" rows="7" cols="50">bla bla bla bla bla</textarea> <a href="#" onclick="insertSmilie(':one:');">One</a> 2 Raz0r: получение того, что выделено: PHP: <script> function getSelected() { var myTextArea = document.getElementById('message'); //IE support if (document.selection) { myTextArea.focus(); sel = document.selection.createRange(); return sel.text; } //MOZILLA/NETSCAPE support else if (myTextArea.selectionStart || myTextArea.selectionStart == "0") { var startPos = myTextArea.selectionStart; var endPos = myTextArea.selectionEnd; var oldText = myTextArea.value; return oldText.substring(startPos, endPos); } else { return ''; } } </script>
Зато работает.. я вам не все ф-ии кинул просто.. априбавим к тому.. и все отлично работает Code: var AddTxt = ""; function getActiveText() { setfocus(); if (!is_ie || (is_ie && !document.selection)) { return false; } var sel = document.selection; var rng = sel.createRange(); if (rng != null && (sel.type == "Text" || sel.type == "None")) { text = rng.text; } if (rng != null && theform.message.createTextRange) { theform.message.caretPos = rng.duplicate(); } return true; } function setfocus() { theform.message.focus(); }
да. в лисе работает отлично... Огромное спасибо. почему-то не могу добавить тебе еще репы(( кстати, а можно вопрос? Как сделать так, чтобы при втыкивании смалика он не был выделен? а то при нажимании на следующий или при попытке написать сразу же текст, смайл будет заменен..это не удобно...
Закомментируй или удали эти строки: PHP: myTextArea.selectionStart = startPos; myTextArea.selectionEnd = startPos + code.length;
Пример реализации можно смотреть в моем скрипте пейджера ( http://dss.moy.su/ ). Там я это дело реализовал на основе прочтения данной темы. Так что всем большой спасибо. З.Ы. Смохнул пыль с купленной год назад книги "Самоучитель JavaScript". Буду читать! Ибо сейчас без явы серьезный сайт не написать.
Всем большое спасибо. Работает отлично. Тему мона закрыть... Или, ввиду большого кол-ва вопросов по JavaScript, оставить и переименовать)
Helios, из-за чего может быть проблема: при нажатии в похожем скрипте на gif-картинку анимация в EI останавливается (например, в гостевой Sad Raven'а)?!