jQuery API

.appendTo()

.appendTo( target ) Returns: jQuery

Description: Insert every element in the set of matched elements to the end of the target.

  • version added: 1.0.appendTo( target )

    targetA selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.

The .append() and .appendTo() methods perform the same task. The major difference is in the syntax-specifically, in the placement of the content and target. With .append(), the selector expression preceding the method is the container into which the content is inserted. With .appendTo(), on the other hand, the content precedes the method, either as a selector expression or as markup created on the fly, and it is inserted into the target container.

Consider the following HTML:

<h2>Greetings</h2>
<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>

We can create content and insert it into several elements at once:

$('<p>Test</p>').appendTo('.inner');

Each inner <div> element gets this new content:

<h2>Greetings</h2>
<div class="container">
  <div class="inner">
    Hello
    <p>Test</p>
  </div>
  <div class="inner">
    Goodbye
    <p>Test</p>
  </div>
</div>

We can also select an element on the page and insert it into another:

$('h2').appendTo($('.container'));

If an element selected this way is inserted elsewhere, it will be moved into the target (not cloned):

<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
  <h2>Greetings</h2>
</div>

If there is more than one target element, however, cloned copies of the inserted element will be created for each target after the first, and that new set (the original element plus clones) is returned.

Example:

Appends all spans to the element with the ID "foo"

<!DOCTYPE html>
<html>
<head>
  <style>#foo { background:yellow; }</style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <span>I have nothing more to say... </span>

  <div id="foo">FOO! </div>
<script>$("span").appendTo("#foo"); // check append() examples</script>

</body>
</html>

Demo:

Support and Contributions

Need help with .appendTo() or have a question about it? Visit the jQuery Forum or the #jquery channel on irc.freenode.net.

Think you've discovered a jQuery bug related to .appendTo()? Report it to the jQuery core team.

Found a problem with this documentation? Report it on the GitHub issue tracker

  • http://twitter.com/aivopaas Aivo Paas

    Where the doc says:
    We can also select an element on the page and insert it into another:
    $('h2').append($('.container'));

    There should be:
    $('h2').appendTo($('.container'));

  • R-Enemy

    This may be a noob question, but I haven’t been able to find a good answer.

    By using appendTo, can you access the element later with jQuery(“#id”)?

    Example:

    $(“”,{id:’div1′}).appendTo(“#container”);
    $(“#div1″).html(‘Hello’); //does this work?

    I’ve had issues with this:

    $(“#container”).html(‘”);
    $(“#div1″).html(“Hello”); //fails

    I’m guessing the latter approach fails because div1 doesn’t really exist in the DOM. So, the root of my question: Does appendTo() or append() add the element/html to the DOM?

    • Anonymous

      try this:
      $(“#container”).html(“”);

    • Hgolov

      Hi,
      I’m having a very similar issue. I am able to append html using $(‘#xxx’).append. But when a click subsequently calls a js function, it does not ‘find’ the elements that were appended. I know that the code goes into the functions because I’ve put alerts everywhere, but it simply does not access any of the new elements. Did you ever figure this out?

    • http://twitter.com/vectorjohn John Reeves

      Yes, it appends to the DOM, where else would it go? Both of your examples work fine, except the second one is missing an ending single quote (‘).

      If you are having problems, it is because of some other issue.

  • Sasha Chedygov

    I don't know if it's just me, but I've found that generating some HTML and then using appendTo is faster than simply appending HTML. For example, this:

    $(“some html”).appendTo($('#element'));

    Is faster than:

    $('#element').append(“some html”);

    Seems unintuitive, but that's what my benchmarks showed. Might be specific to my application, though. And unless you're doing this on thousands of elements at a time (like me), it shouldn't even matter, but I thought I'd share.

    • http://nirahiel.olympe-network.com/ Damien Ansart

      Maybe because in the first case its the $ function that is used on the html markup, maybe a bit faster than the append function to parse HTML ?

      I use it for dialogs, instead of adding a div in my markup and then adding jQuery to it, i make a :
      var div = $(“<div/>”);
      div.attr(“title”,”My Dialog title”).appendTo(“body”).dialog(options);

      In the options i add a listener for the “close” event and then just remove the div.
      Thats a bit slower than if I already had the div in my markup but I want to keep my code clean.

  • Visceroid

    Is it true that if the first element in the jQuery collection (the caller of .add(), or elsewise) was created using a html string (and not yet in DOM), .appendTo() will apply to that first element, but not the rest?
    I tested with these:
    Script:
    $(function()
    {
    var a = $(”).add(‘.test’);
    a.appendTo($(‘#test’)); //only got appended
    });
    HTML body:
    Test

    it works in this way: $(‘.test’).add(”).

    • DBG

      i ran into the same problem.
      several elements a, b, c are created from html (i.e. var a = $('<div>…</div>') )
      and then this is executed
      $([a,b,c]).appendTo('#somewhere');

      only a gets appended.

      • http://twitter.com/vectorjohn John Reeves

        I just had this and looked at the source. appendTo() has a bug in 1.4.2 (fixed in git master), which causes only the first element in a result set to be appended. So in you and Visceroid's case, you have a set with multiple elements you are trying to append and only the first one will work. It internally calls .append() using javascript's apply(), which causes it to pass the matched elements as additional arguments to append.

        E.g.: $([a,b,c]).appendTo('#foo') internally does $('#foo').append(a,b,c), which does exactly what you see because append takes 1 argument.

        In the mean time, you can just use append() instead for most cases.

  • Anonymous

    The docs could mention whether .parent() is implicitly called afterwards, or must be called explicitly — i.e. if the context of the returned jQuery object is still the same or different. For more info please see the link I discovered at http://blog.pengoworks.com/index.cfm/2007/10/26/jQuery-Understanding-the-chain . For a long time I thought there was a bug, since some of my appendTos kept disappearing. Hopefully this info helps others.

    • Damien Ansart

      ‘The docs could mention whether .parent() is implicitly called afterwards, or must be called explicitly’ I don’t think so.
      jQuery always return the element itself.
      For the dans blog example : $(“inner”)
      .appendTo(“outer”)
      .appendTo(“body”);

      First, $ creates a div inner, so this div is the $ object and nothing else.
      then $ try to append it to something, and see this thing doesn’t exists, it creates it (div outer), and then append it, but the object is still inner, so it returns it again.

      A good solution without using parent would be :
      $(“inner”)
      .appendTo($(“outer”)
      .appendTo(“body”));

  • http://twitter.com/robcolburn Rob Colburn

    I found this a bit interesting… (add space in html tag for disqus)

    var base = $(”);
    var list = [ $('') , $('') ];

    // JavaScript error, ok not in spec
    base.append(list);

    // JavaScript error, ahh…
    base.append($(list));

    // Works! with unexpected ‘replace’ behavior
    $(list).appendTo(base);

  • brandonkirsch

    Example for adding a new option to an HTML <select> menu:

    <select name=”uniqueName”>
    <option value=”static”>First Option</option>
    </select>

    <script>
    $('<option>').val('newValue').text('Second Option').appendTo('select[name=uniqueName]');
    </script>

    This creates a new <option> element, sets its value to “newValue” and the display to “Second Option” before appending it to the <select name=”uniqueName”> menu.

  • pte

    I have two select option boxes.. and I wanted to use this function to copy from list A to the list B but when i do so it removes it from list a and appends it to list B. why does it remove it?

    <select size=”3″ id=”lista” name=”lista”>
    <option>item1</option>
    <option>item2</option>
    <option>item3</option>
    <option>item4</option>
    </select>

    <select size=”3″ id=”listb” name=”listb”>
    </select>

    <script language=”javascript” type=”text/javascript” >
    $(document).ready(function(){
    jQuery('#lista').live('dblclick', function() {
    $('#lista option:selected').appendTo('#listb');
    });
    });
    </script>

    If i doubleclick item1 it will remove it from list a and put it in list b while i just want to just put it in list b.

    • Visceroid

      You should use $('#lista option:selected').copy().appendTo('#listb');

      • Visceroid

        Should be: $('#lista option:selected').clone().appendTo('#listb').

        • Marcel

          Thank you! This behaviour puzzled me for hours.

  • Dawn

    Its a shame there isn't the possibility to use a lambda like there is on the .append() function. V1.4.next please?

    EG

    foo.appendTo(function(){return $(this).closest(“bar”)});
    will fail because the scope is wrong. 'this' is the document node, not foo.

    foo.append(function(){return $(this).next()});
    would work as 'this' is foo.

    • Kalisjoshua

      couldn't you take advantage of closure scope something like this:

      foo.appendTo(function(){return foo.closest(“bar”)});

  • Nekcih

    I'm using $.data(myElement, 'key', 'val'); which works fine. I can store and retrieve data. When the javascript context changes, the data is lost. Has anyone else had issues with this? I'm wondering if it's related to appendTo() operating on myElement. I can retrieve the data after performing appendTo() but not after javascript execution leaves the function. Any ideas?

  • Kalisjoshua

    couldn't you take advantage of closure scope something like this:

    foo.appendTo(function(){return foo.closest(“bar”)});