代码之家  ›  专栏  ›  技术社区  ›  Ryan Elkins

jquery-创建复杂HTML片段的最佳实践

  •  54
  • Ryan Elkins  · 技术社区  · 14 年前

    在jquery中创建稍微复杂的HTML元素有没有一般的最佳实践?我试过几种不同的方法。

    首先,我尝试使用createElement并将这些元素与appendto等链接在一起:

    var badge = $(document.createElement("div")).attr("class", "wrapper1").appendTo("body");
    $(document.createElement("div")).attr("class", "wrapper2").appendTo(".wrapper1");
    $(document.createElement("table")).attr("class", "badgeBody").appendTo(".wrapper2");
    $(document.createElement("tr")).attr("class", "row1").appendTo(".badgeBody");
    $(document.createElement("td")).appendTo(".row1");
    $(document.createElement("span")).attr("class", "badgeUnlocked").text("UNLOCKED! ").appendTo("td");
    $(document.createElement("td")).attr("class", "badgeTitleText").appendTo(".row1");
    $(document.createElement("span")).attr("class", "badgeTitle").text(name).appendTo(".badgeTitleText");
    $(document.createElement("tr")).attr("class", "row2").appendTo(".badgeBody");
    $(document.createElement("td")).appendTo(".row2");
    $(document.createElement("img")).attr("src", imgUrl).appendTo(".row2 td");
    $(document.createElement("td")).attr("class", "badgeText").appendTo(".row2");
    $(document.createElement("span")).attr("class", "badgeDescription").text(description).appendTo(".badgeText");
    

    这可能很粗糙,因为appendto想要添加到每个匹配的元素中,所以每个元素都需要自己的名称,否则最终会在整个地方重复添加。

    然后我尝试创建一个数组并将其连接在一起:

    var badgeFragment = [
    '<div><div id="'+ closeId+'" class="closeTab">X</div>',
    '<div id="'+ badgeId+'" class="wrapper1">',
    '<div class="wrapper2">',
    '<div class="badgeBody">',
    '<div class="badgeImage">',
    '<img src="'+ imgUrl +'">',
    '</div>',
    '<div class="badgeContents">',
    '<div class="badgeUnlocked">ACHIEVEMENT UNLOCKED: </div>',
    '<div class="badgeTitle">'+ name +'</div>',
    '<div id="'+ textId+'" class="badgeDescription">'+ description +'</div>',
    '</div>',
    '<div style="clear:both"></div>',
    '</div></div></div></div></div>',
    ]
    
    badgeFragment = $(badgeFragment.join(''));
    

    虽然在IE中,当我放置一个警报($(badgefragment.text())时,它通常是空的。(这是调试更大问题的一部分)。显然我对jquery(甚至是javascript)有点陌生,所以为了确保这不是问题,我尝试了第三种方法-巨型字符串连接:

    var badgeFragment =
    '<div><div id="'+ closeId+'" class="closeTab">X</div>' +
    '<div id="'+ badgeId+'" class="wrapper1">' +
    '<div class="wrapper2">' +
    '<div class="badgeBody">' +
    '<div class="badgeImage">' +
    '<img src="C:/Users/Ryan/Documents/icons/crystal_project/64x64/apps/chat.png">' +
    '</div>' +
    '<div class="badgeContents">' +
    '<div class="badgeUnlocked">ACHIEVEMENT UNLOCKED: </div>' +
    '<div class="badgeTitle">test</div>' +
    '<div id="'+ textId+'" class="badgeDescription">test</div>' +
    '</div>' +
    '<div style="clear:both"></div>' +
    '</div></div></div></div></div>';
    

    这些方法中的一种通常被认为比其他方法更好吗?我对各种各样的资料员不是很在行,所以我不知道如何亲自验证这一点。还有一个问题是,所有这些方法是否都是跨浏览器兼容的。

    9 回复  |  直到 6 年前
        1
  •  59
  •   cllpse    11 年前

    // create an element with an object literal, defining properties
    var e = $("<a />", {
        href: "#",
        "class": "a-class another-class", // you need to quote "class" since it's a reserved keyword
        title: "..."
    });
    
    // add the element to the body
    $("body").append(e);
    

    a link to the documentation

    html() innerHTML

        2
  •  10
  •   Pointy    14 年前

    $('#existingContainer').append(
      $('<div/>')
        .attr("id", "newDiv1")
        .addClass("newDiv purple bloated")
        .append("<span/>")
          .text("hello world")
    );
    

    $.load()

        3
  •  8
  •   lomaxx    14 年前
        4
  •  7
  •   Simon E. pbs    13 年前

    <script type="text/html" id="item_tmpl">
    
      <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
        <div class="grid_1 alpha right">
          <img class="righted" src="<%=profile_image_url%>"/>
        </div>
        <div class="grid_6 omega contents">
          <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
        </div>
      </div>
    
    </script>
    

    var results = document.getElementById("results");
    results.innerHTML = tmpl("item_tmpl", dataObject);
    


    http://ejohn.org/blog/javascript-micro-templating/

        5
  •  3
  •   Skilldrick    14 年前

        6
  •  3
  •   cdmo    10 年前
        7
  •  3
  •   Http.Code.301    8 年前

    $$('div', {'id':'container'},
        $$('div', {'id':'my_div'},
            $$('h1',{'class':'my_header'},
                $$('a',{'href':'/test/', 'class':'my_a_class'}, 'teststring'))));
    

    $$('div', {'id':'container'},
        $$('div', {'id':'my_div'},
            $$('h1',{'class':'my_header'},
                $$('a', { 'href': '/test/', 'class': 'my_a_class' }, 'teststring')
            ).click(function() { alert('clicking on the header'); })
        ).data('data for the div')
    ).hide();
    

    function $$(tagName, attrTextOrElems) {
        // Get the arguments coming after the params argument
        var children = [];
        for (var _i = 0; _i < (arguments.length - 2) ; _i++) {
            children[_i] = arguments[_i + 2];
        }
    
        // Quick way of creating a javascript element without JQuery parsing a string and creating the element
        var elem = document.createElement(tagName);
        var $elem = $(elem);
    
        // Add any text, nested jQuery elements or attributes
        if (attrTextOrElems) {
            if (typeof attrTextOrElems === "string") { // text
                var text = document.createTextNode(attrTextOrElems);
                elem.appendChild(text);
            }
            else if (attrTextOrElems instanceof jQuery) { // JQuery elem
                $elem.append(attrTextOrElems);
            }
            else // Otherwise an object specifying attributes e.g. { 'class': 'someClass' }
            {
                for (var key in attrTextOrElems) {
                    var val = attrTextOrElems[key];
                    if (val) {
                        elem.setAttribute(key, val);
                    }
                }
            }
        }
    
        // Add any further child elements or text    
        if (children) {
            for (var i = 0; i < children.length; i++) {
                var child = children[i];
                if (typeof child === "string") { // text
                    var text = document.createTextNode(child);
                    elem.appendChild(text);
                } else { // JQuery elem
                    $elem.append(child);
                }
            }
        }
        return $elem;
    }
    
        8
  •  0
  •   marcelosalloum    12 年前

    var div1 = $('<div class="colwrap_fof"></div>');        //THE COMPLEX DIV ITSELF
    var div2 = $('<div class="homeimg"></div>');                
    var div21 = $('<div id="backImageDiv'+fof_index+'" class="backDiv"></div>');
    var div22 = $('<div id="frontImageDiv'+fof_index+'"  class="frontDiv"></div>');
    div2.append(div21);
    div2.append(div22);
    div1.append(div2);
    $("#df_background").append(div1);     // ADDING the complex div to the right place      
    

        9
  •  0
  •   Lars-Lasse    6 年前

    <template>

    $(function () {
        // Get template
        var template = $("#template").html();
    
        // Create a new row from the template
        var $row = $(template);
    
        // Add data to the row
        $row.find("td[data-template='firstName']").text("Foo");
        $row.find("td[data-template='lastName']").text("Bar");
    
        // Add the row to the table
        $("#table").append($row);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <template id="template">
      <tr>
        <td data-template="firstName"></td>
        <td data-template="lastName"></td>
      </tr>
    </template>
    
    <table id="table">
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
      </tr>
    </table>