2

我有这个 HTML 结构:

    <p id="lorem">
      <span class="part" id="n01">L</span><span class="part" id="n02">o</span><span class="part" id="n03">r</span><span class="part" id="n04">e</span><span class="part" id="n05">m</span> <span class="part" id="n06">i</span><span class="part" id="n07">p</span><span class="part" id="n08">s</span><span class="part" id="n09">u</span><span class="part" id="n10">m</span>
    </p>

​&lt;h1>Click Me</h1>​​​​​​​​​​​​​​​​​

这个JavaScript代码:

​arrRed = ["#n01", "#n04", "#n05", "#n09"];​​​​​​​​​
arrBlue = ["#n02", "#n07", "#n08"];

$("h1").click(function(){

    $.each(arrRed, function( i, v ){
        $(v).addClass("red");
    });

    $.each(arrBlue, function( i, v ){
        $(v).addClass("blue");
    });
})

http://jsfiddle.net/FF2Dr/

单击时h1,某些字母会变成某种颜色。问题在于性能,我触发了太多的回流/重绘。在另一个问题中,有人告诉我使用parent.cloneNode(true)and parent.parentNode.replaceChild(clone, parent)。所以我克隆了元素,改变了它们,但它们又回到了原位,只触发了一次回流。

所以我克隆了父元素:

var doc = document;
var lorem = doc.getElementById("lorem");
var clone = lorem.cloneNode(true)

但是我现在必须如何进行?我必须以某种方式修改元素clone然后替换它们,但$.each再次使用来编辑它们似乎不是一个好主意。

http://jsfiddle.net/FF2Dr/1/

4

1 回答 1

1

试试这个:

$("h1").click(function(){
    var lorem = $("#lorem"),
        clone = lorem.clone(true);
    clone.children().filter(function() {
        return $.inArray('#' + this.id, arrRed) != -1;
    }).addClass("red").end().filter(function() {
        return $.inArray('#' + this.id, arrBlue) != -1;
    }).addClass("blue");
    lorem.replaceWith(clone);
});

小提琴

创建一个clone,过滤这个新克隆元素的子元素两次以应用类,最后用新元素完全替换旧元素。

或者,如果您愿意,在遍历数组时使用find而不是:filter

$("h1").click(function(){
    var lorem = $("#lorem"),
        clone = lorem.clone(true);
    $.each(arrRed, function(i, v) {
        clone.find(v).addClass("red");
    });
    $.each(arrBlue, function(i, v) {
        clone.find(v).addClass("blue");
    });
    lorem.replaceWith(clone);
});

小提琴

于 2012-07-17T08:05:58.640 回答