English 中文(简体)
妥善地与 j一起积极创造html
原标题:Proper way to generate html dynamically with jQuery

在这个问题上,我发现一些不同和相互矛盾的答复。

我正在根据以JSON数据形式从对应的APIC中获取的结果,开发一个主要与由Kil Query动态生成的html有关的申请。

我的一些同事(个人)告诉我,最好的办法是做这样的事情:

var ul = $("<ul>").addClass("some-ul");
$.each(results, function(index) {
  ul.append($("<li>").html(this).attr("id", index));
});
$("body").append($("<div>").attr("id", "div-id").addClass("some-div").append(ul));

etc. The reason I was told it was that "updates the DOM directly instead of parsing html to achieve it".

然而,我看到许多法典,例如:

var toAppend =  <div class="some-div" id="div-id"><ul> ;
$.each(results, function(index) {
  toAppend +=  <li id="  + index +  ">  + this +  </li> ;
});
toAppend +=  </ul></div> 

我个人认为什么不是立法者,而是更好吗? 我用几分钟时间来讨论这个问题,并找到。 从根本上说,正是通过使用扼杀——我的“第二”方式——来大幅提高业绩。

该条的主要问题是,它已于2009年公布,讨论过格文版本为1.3。 今天,目前的释放是1.6.4版,其行为可以大不相同。 这也是我已经发现的关于这一主题的大多数文章的问题,我也在某种程度上怀疑这些文章的可信度。

因此,我决定在此提出这个问题,并询问——根据业绩,产生OMM的方法实际上是什么?

IMPORTANT EDIT:

我为测试哪些方法正在更好地考虑业绩而写下了一些基准。

jsFiddle - concatenation edition

http://jsfiddle.net/C4Ymm/1/"rel=“noretinger”>jsFiddle - 阵列加入本

法典:

var text = "lorem ipsum";
var strings = $("#strings");
var objects = $("#objects");
var results = $("#results");

// string concatenation
var start = new Date().getTime();
var toAppend = [ <div class="div-class" id="div-id1"><ul class="ul-class" id="ul-id1"> ];
for (var i = 1; i <= 20000; i++) {
    toAppend[i] =  <li class="li-class" id="li-id1-  + i +  ">  + text +  </li> ;
}
toAppend[i++] =  </ul></div> ;
results.append(toAppend.join(""));
strings.html(new Date().getTime() - start);

// jquery objects
var start = new Date().getTime();
var ul = $("<ul>").attr("id", "ul-id2").addClass("ul-class");
for (var i = 0; i < 20000; i++) {
    ul.append($("<li>").attr("id", "li-id2-" + i).addClass("li-class"));
}
results.append($("<div>").attr("id", "div-id2").addClass("div-class").append(ul));
objects.html(new Date().getTime() - start);

看来,在座标上操作的速度比使用 j子和方法快(约7次)。 但是,我可能错了,特别是如果在“基准”法中存在任何错误或业绩判断错误。 感到可以自由改变。

注:我使用Arrayjoin是因为前面提到的条款而不是实际的分类。

EDIT:根据@hradac的建议,我在基准中使用了实际扼杀的分类,实际上改善了时间。

最佳回答

首先,这种微镜几乎从未告诉你你想要知道什么。 第二,你的基准各不相同,并不相同。 例如,你的第一个例子产生了这样的思路:

<li class="li-class" id="li-id1-493">lorem ipsum</li>

阁下,

<li id="li-id2-0" class="li-class"></li>

通知不同的内容次序和缺乏“普通”案文。 也没有试图在试验之间清除结果,以避免因最初20K结果而出现履约问题。

但是,除了这些问题外,还有一个问题,即“这种业绩是否真正扰乱了客户用户的经验?” 严重吗? 您重新提出如此数量的案文,这样你就可以重新看到案文替代方法之间的明显差别?

我har回其他人所说的话,使用一个排时发动机。 这些最快的模板的确非常迅速,甚至有预选方案,使你能够重新提出同样的模板并迅速取得成果。 因此,我不相信我。 相反,相信示威游行。 在这里,我 j笑,以展示新JsRender图书馆的表现,该图书馆本应取代 j状模版发动机。

http://jsfiddle.net/LZLWM/10/

Note: It can take several seconds for JsRender to load into the Fiddle. It s because I m pulling it straight out of GitHub and that s not something that GitHub is particularly good at. I don t recommend that in actual practice. It doesn t change the timings though and it s necessary until jsFiddle starts incorporating templating engines as options.

Notice that the second example, much closer to a real-world example generates 20,000 lines using JSON as its starting point in time approximately the same as your fastest test (< 50ms difference on my machine). Note also that both the code and the template are much clearer and easier to work with than any mess of appends and string concatenation is ever going to be. How many iterations am I going to need to get my template right vs. what you re doing?

如果可能甚至没有必要的话,就在这种微量优化水平上使用简单而停止浪费的时间。 相反,使用诸如这种模板(或其它几个好的排位发动机),确保你把头盔倒在头盔上,你利用一个CDN,你把头盔转嫁给你的服务器等。 “黄色”组织告诉你,这样做将彻底削弱你在此回顾的效应。

问题回答

总的来说,我认为,除非你实际上有问题,否则,可读性影响业绩。 我选择第二种做法,因为这种办法很容易被确认为一种标准的超文本幻灯,我认为它不太容易发生错误。

有了第一种方法,我就不得不在我的精).中用许多法典,只是想一下最后的描述会看什么(因此可能需要修改)。

你们的第一个做法是更好的。 想法不是要与OMM联系,直到你去。 在上述两个例子中,你创建了UL,然后在结尾处附上:.append(<>/code>。

然而,植树的首选方式是你的第一个例子。 扼杀的分类速度略慢(当然,我们再说一流)。 然而,如果你不得不在每页上做这么多的事情,这就会变得很重要。

我把你的法典做一个比喻,但只能读作:

var div = $("<div>").attr("id", "div-id").addClass("some-div");
var ul = $("<ul>").addClass("some-ul");
$.each(results, function(index) {
    var li = $("<li>").html(this).attr("id", index);
    ul.append(li);
});
div.append(ul);

// you haven t touched the DOM yet, everything thus far has been in memory

$("body").append(div); // this is the only time you touch the DOM

基本来说,第一种方法使用多种方法,要求采用内联网生成结果,而第二种方法只使用这种方法。 这是造成执行所需时间差别的主要领域。

我建议采用第3种方法,如果扼杀物极为庞大的话。

var toAppend = [ <div class="some-div" id="div-id"><ul> ];
$.each(results, function(index) {
  toAppend.push( <li id="  + index +  ">  + this +  </li> );
});
toAppend.push( </ul></div> );
$(target).append(toAppend.join(""));

我通常只使用阵列方法。

Edit: hradac是正确的,因此,加固方法现在更为迅速。





相关问题
CSS working only in Firefox

I am trying to create a search text-field like on the Apple website. The HTML looks like this: <div class="frm-search"> <div> <input class="btn" type="image" src="http://www....

image changed but appears the same in browser

I m writing a php script to crop an image. The script overwrites the old image with the new one, but when I reload the page (which is supposed to pickup the new image) I still see the old one. ...

Firefox background image horizontal centering oddity

I am building some basic HTML code for a CMS. One of the page-related options in the CMS is "background image" and "stretch page width / height to background image width / height." so that with large ...

Separator line in ASP.NET

I d like to add a simple separator line in an aspx web form. Does anyone know how? It sounds easy enough, but still I can t manage to find how to do it.. 10x!