【发布时间】:2011-01-14 02:46:34
【问题描述】:
是否有在 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 中当我放一个 alert($(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>';
这些方法中的一种通常被认为比其他方法更好吗?我对各种分析器并不是很擅长,所以我不确定如何自己验证这一点。还有一个问题是所有这些方法是否都兼容跨浏览器。
【问题讨论】:
-
您在 IE 中的警报显示为空,因为“.text()”没有获取 DOM 子树的所有内容。试试 $(badgeFragment).html()