어쩌면이 방법을 사용하여 최적화 할 수 있을지 모르지만 크롬에서만 테스트 한 적이 있지만 다른 브라우저에서도 제대로 작동 할 것입니다. 나는 example online있어)
$(function() {
var selectableLi = $('#selectable li');
selectableLi.mousedown(function(){
var startIndex, endIndex, mouseUpOnLi = false;
// When dragging starts, remove classes active and hover
selectableLi.removeClass('active hover');
// Give the element where dragging starts a class
$(this).addClass('active');
// Save the start index
startIndex = $(this).index();
// Bind mouse up event
selectableLi.bind('mouseup', function(){
// Mouse up is on a li-element
mouseUpOnLi = true;
$(this).addClass('active');
// Remove the events for mouseup, mouseover and mouseout
selectableLi.unbind('mouseup mouseover mouseout');
// Store the end index
endIndex = $(this).index();
// Swap values if endIndex < startindex
if(endIndex < startIndex){
var tmp = startIndex;
startIndex = endIndex;
endIndex = tmp;
}
// Give the selected elements a colour
for(i=startIndex; i<=endIndex; i++){
$(selectableLi[i]).addClass('active');
}
}).bind('mouseover', function(){
// Give elements a hover class when hovering
$(this).addClass('hover');
}).bind('mouseout', function(){
// Remove the hover class when mouse moves out the li
$(this).removeClass('hover');
});
$(document).bind('mouseup', function(e){
// When mouse up is outside a li-element
if(!mouseUpOnLi){
selectableLi.removeClass('active');
}
$(this).unbind('mouseup');
});
}).attr("unselectable","on").css("MozUserSelect","none").bind("selectstart",function(){return false});
});
, 이것에 대한 jQuery를 UI의 필요는 손으로 만든입니다 없다. 항목을 선택하면 배경색이 없습니다. 나는 이것이 더 나은 성능을 줄 것이라고 생각한다.
UPDATE - 선택하는 동안 선택이 볼 수 있도록 내가 그것을 업데이트 Example 2
:
var selectableLi;
function colourSelected(a, b, Class){
selectableLi.removeClass(Class);
// Swap values if a > b
if(a > b){
var tmp = a;
a = b;
b = tmp;
}
// Give the selected elements a colour
for(i=a; i<=b; i++){
$(selectableLi[i]).addClass(Class);
}
}
$(function() {
selectableLi = $('#selectable li');
selectableLi.mousedown(function(){
var startIndex, endIndex, mouseUpOnLi = false;
// When dragging starts, remove classes active and hover
selectableLi.removeClass('active hover');
// Give the element where dragging starts a class
$(this).addClass('active');
// Save the start index
startIndex = $(this).index();
// Bind mouse up event
selectableLi.bind('mouseup', function(){
// Mouse up is on a li-element
mouseUpOnLi = true;
$(this).addClass('active');
// Remove the events for mouseup, mouseover and mouseout
selectableLi.unbind('mouseup mouseover mouseout');
colourSelected(startIndex, $(this).index(), 'active');
}).bind('mouseover mouseout', function(){
// Give elements a hover class when hovering
colourSelected(startIndex, $(this).index(), 'hover');
});
$(document).bind('mouseup', function(e){
// When mouse up is outside a li-element
if(!mouseUpOnLi){
selectableLi.removeClass('active hover');
}
$(this).unbind('mouseup');
selectableLi.unbind('mouseover mouseout');
});
}).attr("unselectable","on").css("MozUserSelect","none").bind("selectstart",function(){return false});
});
다시 말하지만, 어쩌면이 코드는 성능을 위해 어떻게 든 최적화 할 수 있습니다.
나는 정말 오랜 시간이 걸렸다는 것을 알고 있지만 드디어 귀하의 코드로 놀 수있는 기회를 얻었습니다. 필자는 의도 한 응용 프로그램에 가까운 것으로 수정했으며 IE8에서의 성능이 끔찍하다는 점을 제외하고는 훌륭하게 작동합니다. 아마 IE에서 성능이 그렇게 떨어지는 이유에 대해 도움을 줄 수 있습니까? 코드는 http://suanpublic.xtreemhost.com/so/selectable/입니다. "항목 추가"를 5-6 번 클릭하고 여러 줄을 빠르게 선택하십시오. 그런 다음 IE와 다른 브라우저의 차이점을 확인하십시오. – Suan
IE에서 큰 성능 병목 현상을 발견했습니다. 페이지로드 후 추가 된 요소에서 .live()가 매우 느린 것으로 보입니다. 지금은 FF보다 느리지 만 훨씬 더 나은 간단한 .bind()를 사용하고 있습니다. 그 외에도 코드가 많이 도움이되었고 많은 것을 배웠습니다. 감사! – Suan
안녕하세요.] – Harmen