jQuery pattern for DOM building (from strings)?

eli at media.berkeley.edu eli at media.berkeley.edu
Wed Sep 10 21:52:21 UTC 2008


Noah,
I think that the pattern you want is this:

    // build some HTML into a jquery object
    var someDOM = $("<div><span>" +
        "This is a div with a click on it." +
        "</span></div>");

    // bind events to elements, note the (element, container) syntax
    $("span", someDOM).click(function(){
        alert("foo");
    })

    // append the new object into the body
    $('body').append(someDOM);

By the way, I know it seems totally clunky and unprogrammery. But it's
often easier and almost always more performant to build HTML as strings
and then inject it into the DOM.

Did I _get_ the question?

- Eli

> Hi folks,
>
> I can't think of a more qualified group to offer insight here.  When
> doing some modular DOM building, I hit an interesting jQuery thing.
> Specifically, I'm building up small chunks of DOM (from string) and
> returning them where they are being dropped in a larger chunk of DOM,
> etc.  I'm wondering if I'm what I'm doing is halfway clean, naive, or
> ill-advised.
>
> It's roughly like a decorator pattern.  What I'm running into is
> that, when I build up a given DOM chunk, it's at the top level in the
> jQuery object.  This forces me to make a decision between find() and
> filter() to attach events and so on.  It also makes append() / after
> () seem a little flaky.  So, I hacked it...
>
> My simple hack around this has been to start with something like var
> dom = $('<div></div>'); and then doing append()s to that.  I can then
> do find() unconditionally, but I end up returning dom.children().
> Included p.s. is a contrived example of my technique, with respectful
> nods to Steve G.
>
> Does anyone have any particular opinion about this?  Are the Fluid
> components handling this in some super elegant way?
>
> Also, can someone advise about the warning about escaping slashes in
> strings going to DOM/jQuery objects: $('...markup...')? http://
> docs.jquery.com/Core/jQuery#jQuery.28.C2.A0html_.29
>
> Thanks,
> -Noah
>
>
> $(document).ready(function() { $('body').append(buildPanel
> ('awesome!')); });
>
> function buildPanel(someParam) {
>    var dom = $('<div></div>');
>    dom.append('<div class="awesomePanel"></div>');
>    dom.find('div.awesomePanel').append(buildTitleBar());
>    var awesomeData = {};  //go get some awesome data based on someParam
>    dom.find('div.awesomePanel').append(buildPanelBody(awesomeData));
>    return dom.children();
> }
>
> function buildTitleBar() {
>    var dom = $('<div></div>');
>    dom.append('<div class="awesomeTitle"></div>');
>    dom.find('div.awesomeTitle').hover(...);
>    return dom.children();
> }
>
> function buildPanelBody(data) {
>    var dom = $('<div></div>');
>    //make a table of the awesome data
>    dom.append('<table class="awesomeTable">...</table>');
>    return dom.children();
> }
>
> _______________________________________________
> fluid-work mailing list
> fluid-work at fluidproject.org
> http://fluidproject.org/mailman/listinfo/fluid-work
>





More information about the fluid-work mailing list