2011-02-06 6 views

답변

3

jQuery의 select 이벤트는 기본 브라우저 select 이벤트를 랩핑합니다. IE 및 WebKit의 모든 종류의 선택에 대해 발생하지만 다른 브라우저에서는 입력 및 텍스트 영역에서만 발생합니다. 당신은 완벽하게 작동의 누가, 누구에게도 비슷한 답변을 많이 볼 수 있습니다

:

이 질문은 전에 몇 번을왔다. 첫째, 키보드로 선택하거나 편집 및 컨텍스트 브라우저 메뉴에서 "모두 선택"옵션을 통해 선택을 고려해야합니다. 두 번째로, 선택 텍스트를 보면서 선택 변경을 확인하는 것은 전적으로 신뢰할 만하지 않습니다. 사용자가 문서의 다른 위치에서 동일한 텍스트를 선택하면 해당 텍스트가 선택되지 않습니다.

다음은 대부분의 문제를 해결하는 코드입니다. 선택 사항을 폴링하지 않으면 편집 및 컨텍스트 메뉴에서 "모두 선택"에 대해 수행 할 수있는 작업이 없습니다.

var addSelectHandler = function(callback) { 
    var selectionChangeEventHandler; 

    if (typeof window.getSelection != "undefined" && typeof document.addEventListener != "undefined") { 
     var previouslySelected = null; 

     var rangesEqual = function(r1, r2) { 
      return r1.startContainer === r2.startContainer && r1.startOffset === r2.startOffset && 
        r1.endContainer === r2.endContainer && r1.endOffset === r2.endOffset; 
     }; 

     selectionChangeEventHandler = function() { 
      var sel = window.getSelection(), selectedRanges = [], range; 
      var changed = !previouslySelected || (sel.rangeCount != previouslySelected.length); 
      for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
       range = sel.getRangeAt(0).cloneRange(); 
       selectedRanges[i] = range; 
       if (!changed && !rangesEqual(range, previouslySelected[i])) { 
        changed = true; 
       } 
      } 
      previouslySelected = selectedRanges; 
      if (changed) { 
       callback(); 
      } 
     }; 

     document.addEventListener("mouseup", selectionChangeEventHandler, false); 
     document.addEventListener("keyup", selectionChangeEventHandler, false); 
    } else if (typeof document.selection != "undefined" && typeof document.attachEvent != "undefined") { 
     // This is IE, which fires a selectionchange event for any selection 
     document.attachEvent("onselectionchange", callback); 
    } 
}; 

addSelectHandler(function() { 
    alert("Selection changed"); 
} 
+0

mousemove 및 mouseout을 청취함으로써 컨텍스트 메뉴의 select를 처리 할 수있었습니다. 결국 실제로 "모두 선택"에 대해 수행 할 수있는 무언가가 있습니다. – sboisse

+0

@sboisse : 아마도'mousemove' 이벤트가 발생할 때마다 선택을 확인해야할까요? 그것은 저에게 폴링과 거의 같은 것처럼 보입니다. –

+0

폴링 중이지만 타이머를 사용하지 않고 작동하도록하는 방법을 찾고 있었기 때문에 브라우저에서 처리가 덜 낭비되었습니다. – sboisse

2
function getSelText() 
{ 
    var txt = ''; 
     if (window.getSelection) 
    { 
        txt = window.getSelection(); 
             } 
    else if (document.getSelection) 
    { 
        txt = document.getSelection(); 
            } 
    else if (document.selection) 
    { 
        txt = document.selection.createRange().text; 
    } 
    return txt; 
} 

$(document).mouseup(function() { 
    alert(getSelText()); 
}); 

jQuery에 하나가 있는지 알 수 없지만이 플러그인을 사용하여 mouseup 이벤트를 연결하는 새 플러그인을 만들 수 있습니다.

+0

마우스 위치에 기록 된 마우스의 위치가 mouseup에서의 위치와 다른 경우 선택할 수 있습니다. – Robin

+0

더 쉬운 방법은 그냥 텍스트가 있는지 확인하는 것입니다. – Luke

+0

jQuery에서 텍스트 영역과 입력 텍스트로만 제한되는 이유는 무엇입니까? – Viliam