2011-09-26 7 views
2

마우스가 4 개의 사각형 (다른 사각형에 대해 다른 텍스트)에 있으면 마우스 근처에 일부 텍스트를 표시하기 위해 일부 코드를 작성했습니다 (작동 함). html 태그 <지도> </map>, css 및 jquery를 사용했습니다. 모든 것이 잘 작동합니다. 마우스가 그림에서 움직일 때 나는 100 % CPU 사용을 좋아하지 않습니다. jQuery Mousemove 및 성능 질문

은 JQuery와 일부입니다

$('area').each(function(){ 
    var area = $(this), 
     alt = area.attr('alt'); 
    area.mousemove(function(event){ 
     var tPosX = event.pageX +10; 
     var tPosY = event.pageY - 85; 
     $('#rectangletext').css({top: tPosY, left: tPosX}); 
     $('#rectangletext').html(alt); 
    }).mouseleave(function(){ 
     $('#rectangletext').html(''); 
    }); 
}); 

나는 (동일한 컴퓨터에서 동시에) IE, FF, 크롬과 오페라에서 테스트했습니다. Area.mousemove는 마우스를 움직일 때 CPU를 최대 100 %까지 섭취합니다. 문제는 마우스로지도를 움직일 때 필요한 리소스를 줄이는 방법입니다. IE가 최악의 경우 - CPU 사용량이 최대 100 % 뛰어 오른다. FF는 약 67 % -100 %를 먹는다. 오페라는 62 % (결코 62 % 이상)를 먹지 않습니다. 크롬이 가장 좋습니다. 평균 28 %, 최대 42 %입니다.

밀리 초마다가 아니라 필요한 자원을 줄이는 데 도움이되는 경우 300 밀리 초마다 텍스트의 위치를 ​​변경하는 것이 좋습니다. 그렇게하는 방법? mousemove 대신 mouseenter를 사용하는 것보다이 문제에 대한 더 좋은 해결책은 무엇입니까? mouseenter의 단점은 mouseleave가 호출 될 때까지 팝업 텍스트의 위치를 ​​업데이트하지 않는다는 것입니다.

감사합니다.

답변

2

마우스가 마지막으로 이동 한 시간을 추적 할 수 있습니다.

var prevDate; // keep this as a global variable 

// put the following inside the mousemove function 
var date = new Date().getTime(); 
if(date - prevDate > 300){ 
    // your code goes here 
    prevDate = date; 
} 
+0

잘 작동합니다. 고맙습니다. 유일한 문제는 prevDate (모든 소수)에 대한 값을 설정해야한다는 것입니다. 왜냐하면 선언 된 prevDate에 값이없는 경우 (date - prevDate> 300) 항상 false이므로 아무 것도 표시되지 않기 때문입니다. 고맙습니다! BTW, 100 IE는 여전히 100 % CPU를 사용하고, 200ms는 약 80 % CPU를 사용하며, 300ms 약 68 %, 400ms 약 60 %입니다. 고맙습니다. – Haradzieniec

0

마우스 센터에서 간격을 시작하고 그 위치를 업데이트 할 수 있습니다. 좋은 주파수를 찾으려면 간격 시간으로 놀아보십시오. 변수에 jquery 객체를 저장하는 것이 조금은 도움이 될 수 있지만, ID를 통해 액세스하는 것이 매우 빠르다.

0

html 설정은 꽤 비싸며, 실제로는 마우스 센터에서만해야합니다. 선택기를 루프 외부로 이동하면 속도가 향상됩니다.

var $rectText = $("#rectangletext"); 
$('area').each(function(){ 
    var area = $(this), 
     alt = area.attr('alt'); 
    area.mousemove(function(event){ 
     var tPosX = event.pageX +10; 
     var tPosY = event.pageY - 85; 
     $rectText.css({top: tPosY, left: tPosX}); 
    }).mouseenter(function(){ 
     $rectText.html(alt); 
    }).mouseleave(function(){ 
     $rectText.html(''); 
    }); 
}); 
+0

고맙습니다. 나는 너의 모범을 시험해 보았다. 불행히도 동일한 양의 CPU (IE의 경우 100 %)가 필요합니다. 어쨌든 대단히 감사합니다. 어쨌든, 귀하의 대답은 그것이 어떻게 작동하는지 확인하는 데 도움이되었습니다. – Haradzieniec