Баг с js, textarea, как решить?

156
01 декабря 2019, 16:30

Короче, я сделал форму отправки сообщения. В ней сделал див с изображениями (эмоджи). К каждому изображению добавил onclick='smiles("тут id эмоджи")' И всё роботало вроде нормально, при нажатии на какое-то изображение, он добавлял в форме в textarea айди смайла Но проблема в том что, если я нажму на это изображение, уменя вставится id в textarea, и я что-то впишу, потом опять нажму на изображение, то id не будет вставлятся. ПОЧЕМУ? Вот сам код, он сокращён, без html, body, head https://pastebin.com/XsC8M35Q

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
<script type="text/javascript"> 
  function smiles(id) { 
    $("textarea[name='message']").append(id); 
  } 
</script> 
<form action="code.php" id="sender" method="POST" name="form_send_message"> 
  <textarea name="message" minlength="0" maxlength="255" placeholder="Введите сообщение" required><?php echo $_SESSION['msg_mess_err']; unset($_SESSION['msg_mess_err']); ?></textarea> 
  <input type="hidden" value="<?php echo $user_id; ?>" style="width: 0px; height: 0px;" name="recipient_id" /> 
  <input type="submit" name="btn_send_message" value="Отправить"> 
  <br/><br/> 
  <div id="smiles"> 
    Нажмите на эмоджи чтоб его выбрать<br/> 
    <img src="/images/smiles/1.gif" onClick='smiles("[sml1]");'> 
    <img src="/images/smiles/2.gif" onClick='smiles("[sml2]");'> 
    <img src="/images/smiles/3.gif" onClick='smiles("[sml3]");'> 
    <img src="/images/smiles/4.gif" onClick='smiles("[sml4]");'> 
    <img src="/images/smiles/5.gif" onClick='smiles("[sml5]");'> 
    <img src="/images/smiles/6.gif" onClick='smiles("[sml6]");'> 
    <img src="/images/smiles/7.gif" onClick='smiles("[sml7]");'> 
    <img src="/images/smiles/8.gif" onClick='smiles("[sml8]");'> 
    <img src="/images/smiles/9.gif" onClick='smiles("[sml9]");'> 
    <img src="/images/smiles/10.gif" onClick='smiles("[sml10]");'> 
    <img src="/images/smiles/11.gif" onClick='smiles("[sml11]");'> 
    <img src="/images/smiles/12.gif" onClick='smiles("[sml12]");'> 
    <img src="/images/smiles/13.gif" onClick='smiles("[sml13]");'> 
    <img src="/images/smiles/14.gif" onClick='smiles("[sml14]");'> 
    <img src="/images/smiles/15.gif" onClick='smiles("[sml15]");'> 
    <img src="/images/smiles/17.gif" onClick='smiles("[sml17]");'> 
    <img src="/images/smiles/18.gif" onClick='smiles("[sml18]");'> 
    <img src="/images/smiles/19.gif" onClick='smiles("[sml19]");'> 
    <img src="/images/smiles/20.gif" onClick='smiles("[sml20]");'> 
    <img src="/images/smiles/21.gif" onClick='smiles("[sml21]");'> 
    <img src="/images/smiles/22.gif" onClick='smiles("[sml22]");'> 
    <img src="/images/smiles/23.gif" onClick='smiles("[sml23]");'> 
    <img src="/images/smiles/24.gif" onClick='smiles("[sml24]");'> 
    <img src="/images/smiles/25.gif" onClick='smiles("[sml25]");'> 
    <img src="/images/smiles/26.gif" onClick='smiles("[sml26]");'> 
    <img src="/images/smiles/27.gif" onClick='smiles("[sml27]");'> 
    <img src="/images/smiles/28.gif" onClick='smiles("[sml28]");'> 
    <img src="/images/smiles/29.gif" onClick='smiles("[sml29]");'> 
    <img src="/images/smiles/30.gif" onClick='smiles("[sml30]");'> 
    <img src="/images/smiles/31.gif" onClick='smiles("[sml31]");'> 
  </div><br/> 
</form>

Answer 1

Я воспроизвёл Ваш пример. Через инструменты разработчика видно, что id смайлов добавляются в тег textarea в любом случае, видно их в поле для ввода текста или нет. Причина такого поведения в том, как браузер связывает значение полей формы и текст внутри тега textarea (это не совсем одно и то же). В какой-то момент браузер заполняет поле своего внутреннего объекта-формы текстом из textarea и больше не следит за текстом внутри тегов. Когда Вы что-то печатаете в поле для ввода текста, браузер изменяет значение этого объекта формы у себя в памяти. В инструментах разработчика хорошо видно, что введённый вручную текст не появляется между тегами, в то время как на странице он есть. Таким образом, изменять надо значение элемента формы, а не текст внутри тегов. Для этого надо использовать jQuery-метод val().

var text = $("textarea[name='message']");
text.val(text.val()+id);
READ ALSO
Как разбросать элементы шапки по трём сторонам? [закрыт]

Как разбросать элементы шапки по трём сторонам? [закрыт]

Есть шапка, в которой есть строковое меню (горизонтальное), логотип и одна кнопкаНужно, чтобы строковое меню было посередине, логотип слева,...

138
Webpack и jQuery плагины

Webpack и jQuery плагины

Моя задача простая, надо подключить JQuey, JqueryInputmask и собственно мой скрипт

154
Как сделать чтоб при адаптации центр карты менялся?

Как сделать чтоб при адаптации центр карты менялся?

У меня есть карта, в ней указан центр, на десктопе все хорошо, но нужно чтоб на планшете (768px) и на мобильном (320px) центр карты (center: [55759456, 37

127
Наведение на пункты меню bootstrap 3

Наведение на пункты меню bootstrap 3

Стандартное меню Bootstrap 3:

163