2012-07-30 2 views
0

그래서 나는 나에게 이해가되지 않는 raphael.js 라이브러리에 이상한 문제가 있습니다. 나는 위치를 나타내는 점들이있는 세계의지도를 가지고있다. 많은 점들이 서로 겹칩니다. 여러 위치를 골라 내고 싶을 때, 요소를 전경에 붙이고 싶습니다. 다음 코드를 감안할 때 Raphael toFront() oddity

... el.toFront()이 주석 예상대로 코드가 if 문을 기반으로 요소의 정확한 수를 찾는 작동합니다

$("#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 (peer === peerSelected)만이 true로 표시되고 이후에는 하나가 false로 표시됩니다.

현재이 문제의 원인이 무엇인지에 관해서는 난처한 편입니다. 여기서 내가 뭘 잘못하고 있니?

답변

2

이는 라파엘의 foreach는 함수가 무엇을 : bot.next가 null 수 있도록, 요소가리스트의 끝으로 이동하는 문제에 원인이됩니다 현재 항목에 toFront를 호출

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

및 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(); 
+0

멋진 대답. 이것은 아주 잘 작동합니다. 고맙습니다. – Bill