Raphael toFront()古怪

时间:2012-07-30 17:34:23

标签: raphael

所以我对raphael.js库有一个奇怪的问题对我没用。我有一张世界地图,上面有代表地点的点。许多点彼此重叠。当我想挑出不同的位置时,我想把元素带到前台。

鉴于以下代码......

$("#peerIdSelector").change(function() {
    var peerSelected = $(this).val();
    var counter = 0;
    var antiCounter = 0;
    paper.forEach(function (el) {
        var peer = el.data("peer");
        if (peer === peerSelected) {
            //el.toFront();
            el.attr("fill", "#ffff00");
            counter++;
         } else {
            el.attr("fill", "#00ffff" );
            antiCounter++;
         }
    });
    alert(counter + " peers updated for " +  peerSelected + "\n" + antiCounter + " peers not updated")
});

el.toFront()被注释掉时,代码按预期工作,根据if语句查找正确数量的元素。但是,如果我包含el.toFront()指令,则只有遇到的第一个if (peer === peerSelected)将显示为true,之后的每个其他{{1}}将显示为false。

目前我很难过会导致这种行为。我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

这就是Raphael的forEach功能:

paperproto.forEach = function (callback, thisArg) {
    var bot = this.bottom;
    while (bot) {
        if (callback.call(thisArg, bot) === false) {
            return this;
        }
        bot = bot.next;
    }
    return this;
};

在当前项目上调用toFront会导致元素被移动到列表的末尾,因此bot.next将为null,而while循环将比您预期的更早开始。

我建议将其作为解决方案:

var frontSet = paper.set();
paper.forEach(function (el) {
    var peer = el.data("peer");
    if (peer === peerSelected) {
        frontSet.push( el );
        el.attr("fill", "#ffff00");
        counter++;
     } else {
        el.attr("fill", "#00ffff" );
        antiCounter++;
     }
});
frontSet.toFront();