Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery .append() not appending to textarea after text edited

Take the following page:

<html> <head>     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"/> </head> <body>     <div class="hashtag">#one</div>     <div class="hashtag">#two</div>     <form accept-charset="UTF-8" action="/home/index" method="post">         <textarea id="text-box"/>         <input type="submit" value ="ok" id="go" />     </form>      <script type="text/javascript">         $(document).ready(function() {              $(".hashtag").click(function() {                 var txt = $.trim($(this).text());                 $("#text-box").append(txt);             });          });     </script> </body> </html> 

The behavior I would expect, and that I want to achieve is that when I click on one of the divs with class hashtag their content ("#one" and "#two" respectively) would be appended at the end of the text in textarea text-box.

This does happen when I click on the hash tags just after the page loads. However when I then also start editing the text in text-box manually and then go back to clicking on any of the hashtags they don't get appended on Firefox. On Chrome the most bizarre thing is happening - all the text I type manually gets replaced with the new hashtag and disappears.


I probably am doing something very wrong here, so I would appreciate if someone can point out my mistake here, and how to fix that.

Thanks.

like image 758
Krzysztof Kozmic Avatar asked Jan 18 '11 10:01

Krzysztof Kozmic


People also ask

How to append text to textarea in jQuery?

Use val() to append the value of the textarea instead of append(). Get the current value from textarea, then concatenate the new text.

How do I edit text in textarea?

Alternatively, you can use jQuery's . html() method, which uses the browser's innerHTML property to replace textarea content with the new content completely. Another good solution is to use the . val() method to set the text value of the textarea element.

How do I add text to textarea?

To add text to a textarea, access the value property on the element and set it to its current value plus the text to be appended, e.g. textarea. value += 'Appended text' . The value property can be used to get and set the content of a textarea element.

What is append in jQuery?

jQuery append() Method The append() method inserts specified content at the end of the selected elements. Tip: To insert content at the beginning of the selected elements, use the prepend() method.


2 Answers

2 things.

First, <textarea/> is not a valid tag. <textarea> tags must be fully closed with a full </textarea> closing tag.

Second, $(textarea).append(txt) doesn't work like you think. When a page is loaded the text nodes inside the textarea are set the value of that form field. After that, the text nodes and the value can be disconnected. As you type in the field, the value changes, but the text nodes inside it on the DOM do not. Then you change the text nodes with the append() and the browser erases the value because it knows the text nodes inside the tag have changed.

So you want to set the value, you don't want to append. Use jQuery's val() method for this.

$(document).ready(function(){   $(".hashtag").click(function(){     var txt = $.trim($(this).text());     var box = $("#text-box");     box.val(box.val() + txt);   }); }); 

Working example: http://jsfiddle.net/Hhptn/

like image 82
Alex Wayne Avatar answered Oct 11 '22 13:10

Alex Wayne


Use the val() function :)

<html>     <head>         <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>     </head>     <body>         <div class="hashtag">#one</div>         <div class="hashtag">#two</div>         <form accept-charset="UTF-8" action="/home/index" method="post">             <textarea id="text-box"></textarea>             <input type="submit" value ="ok" id="go" />         </form>         <script type="text/javascript"> $(document).ready(function(){    $(".hashtag").click(function(){     var txt = $.trim($(this).text());     $("#text-box").val($("#text-box").val() + txt);   }); });         </script>     </body> </html> 

Does that help?

The reason append does not seem to work is because the value of the textarea is made up of the child node, but by treating it as multiple seperate nodes the screen won't update, according to my Firebug. Firebug will show me the updated child nodes, but NOT the text I typed manually into the textarea, whereas the screen shows me the manually typed text but not the new nodes.

like image 29
Pim Avatar answered Oct 11 '22 12:10

Pim