За последние 24 часа нас посетили 19513 программистов и 1631 робот. Сейчас ищут 1805 программистов ...

Смайлики в textarea

Тема в разделе "JavaScript и AJAX", создана пользователем Salvat, 29 май 2016.

  1. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Здравствуйте. Имеется такой код, javascript
    Код (Javascript):
    1. var ie=document.all?1:0;
    2. var ns=document.getElementById&&!document.all?1:0;
    3.  
    4. function InsertSmile(SmileId)
    5. {
    6. if(ie)
    7. {
    8. document.all.comment.focus();
    9. document.all.comment.value+=" "+SmileId+" ";
    10. }
    11.  
    12. else if(ns)
    13. {
    14. document.forms['funforma'].elements['comment'].focus();
    15. document.forms['funforma'].elements['comment'].value+=" "+SmileId+" ";
    16. }
    17.  
    18. else
    19. alert("Ваш браузер не поддерживается!");
    20. }
    Имеется форма

    PHP:
    1.  <form id='submit_wall' name='funforma' >
    2.                                                 <p><textarea type='text' name='comment' id='".$row['id']."' value='' style='height:100p' /></textarea>
    3.                                                 <p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p>     <div class='smile'>
    4.    
    5.  
    6.     <a href='javascript:x()' onclick=\"InsertSmile(':-*')\"><img src='smile/1.gif'/></a>
    7.    <a href='javascript:x()' onclick=\"InsertSmile(':)')\"><img src='smile/2.gif'/></a>
    8.    <a href='javascript:x()' onclick=\"InsertSmile(':(')\"><img src='smile/3.gif'/></a>
    9.    <a href='javascript:x()' onclick=\"InsertSmile(';)')\"><img src='smile/4.gif'/></a>
    10.    <a href='javascript:x()' onclick=\"InsertSmile(':P')\"><img src='smile/5.gif'/></a>
    11.    <a href='javascript:x()' onclick=\"InsertSmile('8)')\"><img src='smile/6.gif'/></a>
    12.    <a href='javascript:x()' onclick=\"InsertSmile(':D')\"><img src='smile/7.gif'/></a>
    13.    <a href='javascript:x()' onclick=\"InsertSmile('=O')\"><img src='smile/9.gif'/></a>
    14.    <a href='javascript:x()' onclick=\"InsertSmile(':-x')\"><img src='smile/10.gif'/></a>
    15.    <a href='javascript:x()' onclick=\"InsertSmile('(T_T)')\"><img src='smile/11.gif'/></a>
    16.  
    17. </div>";
    18.                        
    19.                          $stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
    20.                                                  Отправить</a> </p>
    21.                                                </form>
    В textarea вставляются символы обозначения смайликов, а хотелось бы чтобы были изображения. Подскажите, пожалуйста, как это реализовать.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    @denis01, вставил textarea
    contenteditable="false" чтобы элемент не изменялся. Мы вроде друг друга не так поняли. Мне необходимо чтобы отображалось изображение, а не запрет на редактирование текста. Смайл отображается так : ) а нужно изображение :)которое ему присвоенно.
     
    #3 Salvat, 29 май 2016
    Последнее редактирование: 29 май 2016
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Делай div с contenteditable и вставляй тег img.
    Почитай как делают WYSIWYG редакторы на HTML и JavaScript.
     
  5. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    @denis01, пробовал с div contenteditable, брал все в блок, отдельно картинки не выходит. А за редакторы пишут как их польностью реализовывать, мне необходимы только смайлы.
     
  6. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Salvat, скорее ты не понял, о чем тебе пишут.
    Давно делал пример, не охото переписывать, нужно будет сам перепишешь:

    HTML:
    1. <!DOCTYPE html>
    2.     <style>
    3.         #textarea{background:#FFFFFF;color:black;border:1px solid #C0CAD5;width:328px;min-height:40px;padding:3px 25px 3px 3px;padding-bottom:5px;margin-bottom:3px;outline:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:150%;word-wrap:break-word;cursor:text;}
    4.         .emoji{width:20px;height:20px;margin:0px;border:none;vertical-align:top;
    5.         }
    6.     </style>
    7. </head>
    8.     <div id="smiles">
    9.         <img src="smile/kiss.gif">
    10.         <img src="smile/rose.gif">
    11.         <img src="smile/wink.gif">
    12.     </div>
    13.     <div id="textarea" tabindex="0" contenteditable="true" ondragend="return true"></div>
    14.     <script type="text/javascript">
    15.         var arr = document.getElementById('smiles').getElementsByTagName('img');
    16.         for(var i in arr) {
    17.             if(arr.hasOwnProperty(i)) {
    18.                 arr[i].onclick = function(event) {
    19.                     if('img' === this.tagName.toLowerCase()) {
    20.                         var img = ' <img class="emoji" src="'+this.src+'">&nbsp;';
    21.                         document.execCommand('insertHTML', false, img);
    22.                     }
    23.                 };
    24.             }
    25.         }
    26.     </script>
    27. </body>
    28. </html>
    29.  
     
    Salvat нравится это.
  7. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Используя код rodent90 я переписал свою форму под свои нужды. Теперь код имеет такой вид
    PHP:
    1.        <form id='submit_wall' name='funforma'  >
    2.                                                 <p><div  class='textarea_stena' name='comment'  id='".$row['id']."' tabindex='0' contenteditable='true' ondragend='return true'></div>
    3.                                                 <p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p>    <div id='smiles'>
    4.         <img src='smile/1.gif'>
    5.         <img src='smile/2.gif'>
    6.         <img src='smile/3.gif'>
    7.     </div>
    8.     ";
    9.                
    10.                        $stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
    11.                                                 Отправить</a> </p>
    12.                                               </form><br/><br />';
    С помощью цикла выводятся сообщения и смайлики, где textarea_stena - это класс

    Код (CSS):
    1.         .textarea_stena{background:#FFFFFF;color:black;border:1px solid #C0CAD5;width:328px;min-height:
    2.     40px;padding:3px 25px 3px 3px;padding-bottom:5px;margin-bottom:3px;
    3.     outline:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:150%;word-wrap:break-word;cursor:text;}
    4.         .emoji{margin:0px;border:none;vertical-align:top;
    5.         }
    А это код который отображает изображение и отправляет POST запрос для записи в базу данных.
    Код (Javascript):
    1. function comment(text, message_id){
    2.     $.ajax({
    3.         type: "POST",
    4.         url: "profile.php",
    5. data:"comment=" + text+"&messageid="+message_id,
    6.         success: function(){
    7.             $("ul#wall").prepend("<li style=\"display: none;\">"+ text +"</li>");
    8.             $("ul#wall li:first-child").fadeIn();
    9.             }
    10.         });
    11.     return false;
    12. };
    13.  
    14.  
    15.  
    16. var arr = document.getElementById('smiles').getElementsByTagName('img');
    17.         for(var i in arr) {
    18.             if(arr.hasOwnProperty(i)) {
    19.                 arr[i].onclick = function(event) {
    20.                     if('img' === this.tagName.toLowerCase()) {
    21.                         var img = ' <img class="emoji" src="'+this.src+'">&nbsp;';
    22.                         document.execCommand('insertHTML', false, img);
    23.                     }
    24.                 };
    25.             }
    26.         }
    Смайлики отображаются как необходимо, только работает код только с самым первым textarea который выводит сообщение из базы данных, с другими почему-то не работает. Так же при попытке отправить POST запрос в базу записывается undefined. Если Вас не затруднит, не могли бы пожалуйста объяснить где моя ошибка с отправкой POST(ошибка undefined) и так же с передачей фокуса разным textarea с уникальными id.
    --- Добавлено ---
    В FireBug получаю ошибку с указанием строки, это после обновления страницы.
    Код (Text):
    1. TypeError: document.getElementById(...) is null
    2.  
    3.  
    4. var arr = document.getElementById('smiles').getElementsByTagName('img');
     
    #7 Salvat, 8 июн 2016
    Последнее редактирование: 8 июн 2016
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    не понятно что это, можно попробовать заменить на
    Код (Javascript):
    1. var arr = $("тут должен быть css selector на теги со смайликами");
    это на скорую руку по коду от @rodent90, если я его правильно понял

    @Salvat у тебя есть такое?
    HTML:
    1.     <div id="smiles">
    2.         <img src="smile/kiss.gif">
    3.         <img src="smile/rose.gif">
    4.         <img src="smile/wink.gif">
    5.     </div>
     
  9. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Да, это у меня в PHP коде. только смайлики пронумерованы.
    PHP:
    1.  <div id='smiles'>
    2.         <img src='smile/1.gif'>
    3.         <img src='smile/2.gif'>
    4.         <img src='smile/3.gif'>
    5.     </div>
    6.     ";
    7.          
    Код работает, в плане отображения смайликов, проблема заключается в отправке POST запроса и передаче фокуса разным textarea. Отображаются смайлики только в первом, в остальных нет, прикладываю скрин-шот.
    [​IMG]
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (Javascript):
    1. var arr = $("#smiles");
    но думаю там ещё что-то нужно доработать
     
  11. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    В ответе получаю undefined. На скрин-шоте видно в самой первой строчке, ответ такой же.
     
  12. Salvat

    Salvat Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    101
    Симпатии:
    0
    Таким образом я добился в div писать смайл, а в скрытый input его мнемоника.
    HTML:
    1. <!DOCTYPE html>
    2.  
    3.  
    4.     <style>
    5.         .textarea_stena{background:#FFFFFF;color:black;border:1px solid #C0CAD5;width:328px;min-height:
    6.     40px;padding:3px 25px 3px 3px;padding-bottom:5px;margin-bottom:3px;
    7.     outline:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:150%;word-wrap:break-word;cursor:text;}
    8.         .emoji{margin:0px;border:none;vertical-align:top;
    9.         }
    10.     </style>
    11. </head>
    12.     <div id="smiles">
    13.         <img src='smile/1.gif'/>
    14.     <a href='javascript:x()' onclick="InsertSmile(':)')"><img src='smile/2.gif'/></a>
    15.     <a href='javascript:x()' onclick="InsertSmile(':(')"><img src='smile/3.gif'/></a>
    16.     <a href='javascript:x()' onclick="InsertSmile(';)')"><img src='smile/4.gif'/></a>
    17.     <a href='javascript:x()' onclick="InsertSmile(':P')"><img src='smile/5.gif'/></a>
    18.     <a href='javascript:x()' onclick="InsertSmile('8)')"><img src='smile/6.gif'/></a>
    19.     <a href='javascript:x()' onclick="InsertSmile(':D')"><img src='smile/7.gif'/></a>
    20.     <a href='javascript:x()' onclick="InsertSmile('=O')"><img src='smile/9.gif'/></a>
    21.     <a href='javascript:x()' onclick="InsertSmile(':-x')"><img src='smile/10.gif'/></a>
    22.     <a href='javascript:x()' onclick="InsertSmile('(T_T)')"><img src='smile/11.gif'/></a>
    23.     </div>
    24. <form id='submit_wall' name='funforma' >
    25.     <div  class="textarea_stena" id="comment" tabindex="0" contenteditable="true" ondragend="return true" onkeyup="copy_text(this.value)"></div>
    26.     <input  id="comment_text" value=''  type="text" style='height:100p'  />
    27.    
    28.  
    29.    
    30. </form>
    31.     <script type="text/javascript">
    32.         var arr = document.getElementById('smiles').getElementsByTagName('img');
    33.         for(var i in arr) {
    34.             if(arr.hasOwnProperty(i)) {
    35.                 arr[i].onclick = function(event) {
    36.                     if('img' === this.tagName.toLowerCase()) {
    37.                         var img = ' <img class="emoji" src="'+this.src+'">&nbsp;';
    38.                         document.execCommand('insertHTML', false, img);
    39.                     }
    40.                 };
    41.             }
    42.         }
    43.     var ie=document.all?1:0;
    44. var ns=document.getElementById&&!document.all?1:0;
    45.  
    46. function InsertSmile(SmileId)
    47. {
    48. if(ie)
    49. {
    50. document.all.comment.focus();
    51. document.all.comment.value+=" "+SmileId+" ";
    52. }
    53.  
    54. else if(ns)
    55. {
    56. document.forms['funforma'].elements['comment_text'].focus();
    57. document.forms['funforma'].elements['comment_text'].value+=" "+SmileId+" ";
    58. }
    59.  
    60. else
    61. alert("ошибка браузера");
    62. }
    63. function copy_text(val) {
    64.     document.getElementById("comment_text").value = val;
    65. }
    66.     </script>
    67.    
    68. </body>
    69. </html>
    У меня возникли следующие проблемы, это передача текста в скрытый input, и так же фокус уходит на input после вставки мнемоника.
    Текст у меня получается передавать только с input в input, с div textarea не получается в input. Или с одного textarea в другой. Использую JS
    Код (Javascript):
    1. function copy_text(val) {
    2.     document.getElementById("comment_text").value = val;
    3. }
    и код формы
    HTML:
    1. <form id='submit_wall' name='funforma' >
    2.     <div  class="textarea_stena" id="comment" tabindex="0" contenteditable="true" ondragend="return true" onkeyup="copy_text(this.value)"></div>
    3.     <input  id="comment_text" value=''  type="text" style='height:100p'  />
    4.    
    5.  
    6.    
    7. </form>
    8.  
    Снова получаю ошибку undefined. Подскажите где моя ошибка и как ее исправить.
     
  13. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    у div нет this.value, соответственно, взять ему нечего. Смотри innerHTML
     
  14. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Если динамически добавим, будет! Суть не в этом, а в том, что он не правильно составляет логику и структуру.
    Кратко:
    Есть место со смайлами и их символами.
    HTML:
    1. <img src="smile/kiss.gif" alt="=*">
    Где src - это смайл, а alt - это символ смайла который при вводе будет отображать смайл (к примеру если мы вводим символ, чтобы сразу отображался смаил, нужно сверить уже с имеющими символами и смаилами по событию onkeyup и заменить символ на смаил).
    Далее идет место для коммента и смайлов.
    За исключением того, что в textarea нет визуального просмотра содержимого, используется div с атрибутом contenteditable - который как-раз дает возможность редактировать содержимое нашего div визуально и без повреждений исходного кода.
    Следовательно по клику на смайл, нам нужно добавлять его в позицию выставленной каретки.
    После этого простая отправка $.post содержимого div.
    Не все так просто, как кажется, для тебя будет трудновато решить.
    Но! Если начнешь вникать глубже сделаешь.
     
    #14 rodent90, 10 июн 2016
    Последнее редактирование: 10 июн 2016