Вставка текста в textarea через клик мышью(JS)

Discussion in 'PHP' started by DRON-ANARCHY, 21 Apr 2007.

  1. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    Так... Такая проблема... :)
    Попробывал пример товарища Fr-Ron'a заюзать. Если код в <head></head> - то работает. Если в <body></body> - То не в какую! Что делать?

    Вот приведите привер, как реализовать, чтобы текст вставлялся в форму:
    Code:
    <textarea type="text" rows=4 cols=40 name="text"></textarea>
    Которая находится внутри тега <body>. Буду очень благодарен. ;)
     
  2. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    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>
    и тд

    наркоманское решение .. но все же =)
     
    #22 darky, 23 Apr 2007
    Last edited: 23 Apr 2007
    2 people like this.
  3. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    713
    Likes Received:
    142
    Reputations:
    50
    и так тоже не работает)
    и в HEAD тоже не работает. мир - дерьмо. я убью себя
     
    #23 DRON-ANARCHY, 23 Apr 2007
    Last edited: 23 Apr 2007
  4. Raz0r

    Raz0r Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    126
    Likes Received:
    20
    Reputations:
    0
    А что насчет бб-тегов из разряда [#quote]? Как определить - какой текст (а вернее какая его часть) выделен в textarea?
     
  5. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    713
    Likes Received:
    142
    Reputations:
    50
    Так... давайте сначала с моим вопросом разберемся))
    а хотя ладно. .мне не жалко)
     
  6. Raz0r

    Raz0r Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    126
    Likes Received:
    20
    Reputations:
    0
    да, кстати, те скрипты, что оговаривались выше - будут вставлять смайл в конец сообщения, или в текущую позицию в тексте?
     
  7. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    По поводу "наркоманского решения" 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 я и предполагать боюсь...
     
    #27 Helios, 23 Apr 2007
    Last edited: 23 Apr 2007
  8. Raz0r

    Raz0r Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    126
    Likes Received:
    20
    Reputations:
    0
    т.е. за выделение отвечает фишка Middle ?
     
  9. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Мой вариант:
    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(0startPos) + code oldText.substring(endPosoldText.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(startPosendPos);
        } else {
            return 
    '';
        }
    }
    </script>
     
    #29 Helios, 23 Apr 2007
    Last edited: 23 Apr 2007
    1 person likes this.
  10. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    Зато работает..

    я вам не все ф-ии кинул просто..
    априбавим к тому.. и все отлично работает
    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();
    }
    
     
  11. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    Helios
    РАБОТАЕТ!!! Огромное спасибо!!! Но вот в ФФ не работает, хоть ты ему стреляй!
     
    1 person likes this.
  12. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Проверял в 2.0.0.2 - все работает
     
  13. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    713
    Likes Received:
    142
    Reputations:
    50
    да. в лисе работает отлично... Огромное спасибо.
    почему-то не могу добавить тебе еще репы((

    кстати, а можно вопрос? Как сделать так, чтобы при втыкивании смалика он не был выделен? а то при нажимании на следующий или при попытке написать сразу же текст, смайл будет заменен..это не удобно...
     
  14. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Закомментируй или удали эти строки:
    PHP:
    myTextArea.selectionStart startPos
    myTextArea.selectionEnd startPos code.length;
     
  15. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    Пример реализации можно смотреть в моем скрипте пейджера ( http://dss.moy.su/ ). Там я это дело реализовал на основе прочтения данной темы. Так что всем большой спасибо.

    З.Ы. Смохнул пыль с купленной год назад книги "Самоучитель JavaScript". :) Буду читать! Ибо сейчас без явы серьезный сайт не написать.
     
  16. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    713
    Likes Received:
    142
    Reputations:
    50
    Всем большое спасибо. Работает отлично.
    Тему мона закрыть... Или, ввиду большого кол-ва вопросов по JavaScript, оставить и переименовать)
     
  17. bopoh13

    bopoh13 Elder - Старейшина

    Joined:
    31 Oct 2006
    Messages:
    195
    Likes Received:
    20
    Reputations:
    0
    Helios, из-за чего может быть проблема: при нажатии в похожем скрипте на gif-картинку анимация в EI останавливается (например, в гостевой Sad Raven'а)?!
     
  18. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Кинь ссылку - вечером будет время, посмотрю
     
    1 person likes this.
  19. bopoh13

    bopoh13 Elder - Старейшина

    Joined:
    31 Oct 2006
    Messages:
    195
    Likes Received:
    20
    Reputations:
    0
    _http://dynamotkd.ru/guest.php :confused:
    Причем в ФФ этого не наблюдается.