2009-12-17 4 views
5

저는 텍스트 영역을 기반으로하는 맞춤 토큰 필드를 만들고 있습니다. 아이디어는 div 요소가있는 텍스트 영역을 절대적으로 위에 놓는 것입니다. 따라서 은 텍스트 영역에있는 것처럼처럼 보입니다.어떻게 뒤로 선택을 설정합니까?

지금까지 고통 스러웠지 만 한 가지를 제외하고는 거의 모든 것을 처리했습니다.

역 선택을 자바 스크립트로 설정할 수 있습니까? 텍스트 영역의 중간에 커서를 놓으면 shift 키를 누른 상태에서 왼쪽 화살표를 몇 번 누르면 선택 항목이 표시됩니다. 까다로운 부분은 평소와 다르다는 것입니다. 뒤로 가야합니다. (시작은 오른쪽에서 시작하는 것이지 일반적으로는 그렇지 않습니다.) 내 div (토큰)를 표시하는 텍스트 영역에 자리 표시자가 있습니다. 그 중 하나를 탐색하면 커서가 자리 표시 자의 반대쪽 가장자리로 점프하므로 자연 스럽습니다. Shift 키를 누른 상태에서 자리 표시 자에 도달하면 오른쪽으로 점프하고 새 선택 항목을 설정하므로 토큰을 선택하는 것처럼 보입니다 (삭제를 누르고 토큰 자체로 선택된 범위를 제거 할 수 있습니다) . 새로운 선택을 설정하면이 일을 unreverted 만들 것 때문에 당신이, 오른쪽에서 왼쪽으로 이동한다면 그것은 늘 가능성이 작동 :

왼쪽에서 오른쪽 선택 :

abcde[start]efg[end](token) 
[shift]+[right] 
abcde[start]efg(token)[end] 
[del] 
abcde 

오른쪽에서 왼쪽으로 선택

(token)[end]efg[start]abcde 
[shift]+[left] 
[start](token)abcdeefg[end] //see? it's back to normal 
[shift]+[left] 
[start](token)abcdeef[end]g //huh?! shift-right moves end point (unexpected) 
abcde 

그래서 여기가 질문 : 나는 끝 지점보다 더 큰 것 시작점 텍스트 영역에서 선택을 설정할 수 있습니까? 간단히 element.setSelectionRange(right, left)가 파이어 폭스, 다른 어떤 아이디어에서 작동하지 않는가?

+1

아주 좋은 질문입니다! – Boldewyn

+0

이것은 매우 흥미 롭습니다. 링크를 얻을 수 있을까요, 아니면 NASA의 수퍼 스쿨입니까? :) –

+0

진행중인 위젯에서 여전히 작동합니다. 하지만 아마 그것이 끝났을 때 나는 그것을 풀 수있을 것입니다 (mootools입니다). 다음은 작동 방식을 알려주는 이미지입니다. http://img.skitch.com/20091217-89kmqxu8subd5xr8yn1ut7953b.png (모든 종류의 이벤트를 감지하여 숨겨진 div에서 렌더링하려고 시도한 다음, 토큰의 위치와 텍스트 영역 위의 위치 지정) 사실 맥 오에스텐의 Mail.app에있는 tokenfield의 클론입니다. 매우 가까운 클론 복제본 :) – user233603

답변

1

Firebug 콘솔에서 약간의 실험을 한 후, 나는 그것이 사소하지 않다고 생각한다. 그러나 키 누르기 이벤트를 차단할 수 있습니다.

사용자가 왼쪽 화살표를 누르면 사용자가 왼쪽으로 확장하고 false을 반환해야합니다. 그런 다음 브라우저의 기본값은 호출되지 않지만 사용자는 왼쪽 방향 선택의 느낌을 갖습니다.

textarea.onkeypress = function (event) { 
    if (!event){event = window.event; /* %#$! IE */ } 
    if (event.shiftKey && event.keyCode == 37 /* left */) { 
    event.target.selectionStart = currentSelectionStart - 1; 
    } 
    return false; 
}; 

37는 왼쪽 화살표, 38은 위쪽, 39는 오른쪽, 40은 아래쪽입니다.

+0

그래,하지만 그것은 사소한 것도 아니야. 아마도 내가 텍스트를 선택 취소하거나 새로운 선택을 할 수있는 모든 이벤트를 듣지 않으면 안되기 때문이다. 하지만 어떻게 든 선택 이벤트를 x 브라우저 방식으로 추적하는 것이 쉽지 않은 경우에도 이것이 유일한 방법이라고 생각합니다. 시도해 주셔서 감사합니다. – user233603