범위가있는 경우 getBoundingClientRect을 통해 경계 사각형을 가져올 수 있습니다. 그 반대가 가능합니까? 즉, 픽셀의 사각형이 주어진 경우 Range를 만듭니다.픽셀 범위
Q
픽셀 범위
1
A
답변
0
예 아니요.
범위가 대부분의 브라우저에서 여러 위치의 텍스트를 선택할 수 없기 때문에 하나의 범위 만 만들려는 경우 일반적으로 불가능합니다 (예 : "픽셀 사각형"높이가 둘 이상의 텍스트 인 경우). 선). 여기서 언급 한 "픽셀의 사각형"은 더 정확하게 클리핑 사각형입니다.
복수 범위에 동의하는 경우 가능합니다. 주요 아이디어는 자르기 직사각형의 각 라인에 하나의 범위를 만드는 것입니다. 대부분의 브라우저는 다중 선택을 지원하지 않기 때문에 선택 항목이 화면에 표시되지 않지만 최소한 클리핑 사각형에있는 텍스트를 추출 할 수 있습니다. 이것은 내가 그것을 구현하는 방법입니다
var columnModeSelection = {
startX:10,
startY:10,
endX:20,
endY:30,
selectedTextRanges:null // an Array of Range
};
createColumnModeSelection();
/**
Emulates MSIE function range.moveToPoint(x,y) by returning the selection node info which corresponds to the given x/y location.
@param x the point X coordinate
@param y the point Y coordinate
@return the node and offset in characters as {node,offsetInsideNode} (e.g. can be passed to range.setStart)
*/
function getSelectionNodeInfo(x, y) {
var startRange = document.createRange();
window.getSelection().removeAllRanges();
window.getSelection().addRange(startRange);
// Implementation note: range.setStart offset is
// counted in number of child elements if any or
// in characters if there is no childs. Since we
// want to compute in number of chars, we need to
// get the node which has no child.
var elem = document.elementFromPoint(x, y);
var startNode = (elem.childNodes.length>0?elem.childNodes[0]:elem);
var startCharIndexCharacter = -1;
do {
startCharIndexCharacter++;
startRange.setStart(startNode, startCharIndexCharacter);
startRange.setEnd(startNode, startCharIndexCharacter+1);
var rangeRect = startRange.getBoundingClientRect();
} while (rangeRect.left<x && startCharIndexCharacter<startNode.length-1);
return {node:startNode, offsetInsideNode:startCharIndexCharacter};
}
/**
Copy user selection to clipboard in plain text.
Multibrowser: supported under MSIE and WebKit
*/
function createColumnModeSelection() {
// build a TextRange for each line to select
var startY = columnModeSelection.startY;
columnModeSelection.selectedTextRanges=new Array();
while (startY<columnModeSelection.endY) {
// select the line
var range = null;
if (document.selection) {
// MSIE
// Implementation note: the TextRange cannot be created from pixel
// coordinates, only the start point can. Thus, we are creating two
// TextRanges with a start point and set the end point of the first
// range to the start point of the end range.
// set the start point
range = document.selection.createRange();
range.moveToPoint(columnModeSelection.startX, startY);
// set the end point
var endRange = document.selection.createRange();
endRange.moveToPoint(columnModeSelection.endX, startY); // set the first line end
range.setEndPoint("EndToStart", endRange);
// create the selection
range.select();
} else {
// other browsers
var lineStartNodeInfo = getSelectionNodeInfo(columnModeSelection.startX, startY);
var lineEndNodeInfo = getSelectionNodeInfo(columnModeSelection.endX, startY);
range = document.createRange();
range.setStart(lineStartNodeInfo.node, lineStartNodeInfo.offsetInsideNode);
range.setEnd(lineEndNodeInfo.node, lineEndNodeInfo.offsetInsideNode+1);
}
// keep the selection for later usage
if (range!=null) {
columnModeSelection.selectedTextRanges.push(range);
}
// go to the next line
var elem = document.elementFromPoint(columnModeSelection.startX, startY);
var lineHeight = elem.clientHeight;
startY += lineHeight;
}
// clear the last selected range
if (document.selection) {
// MSIE
document.selection.empty();
} else {
// Safari, Firefox
window.getSelection().removeAllRanges();
}
}
이 다음 브라우저에서 테스트되었습니다
- MSIE 7, MSIE 9
- 파이어 폭스 5, 파이어 폭스 10
- 크롬 9
- Safari 5
0
나는 이것을 최근에 선택했습니다. Range를 지원하는 브라우저에서 범위를 만든 다음 선택하므로 선택 항목을 제거하는 것이 쉽습니다.
관련 문제
- 1. ARGB 범위 사이의 픽셀 색상 결정
- 2. 픽셀 평방 피트 당
- 3. 픽셀 단위로 TStringGrid 픽셀 스크롤
- 4. CSS의 픽셀 (픽셀)이란 무엇입니까?
- 5. WPF 픽셀 대 데스크톱 픽셀
- 6. 픽셀 단위로 이미지 픽셀 읽기
- 7. 픽셀 : 특정 플롯 내의 픽셀 얻기
- 8. 픽셀 조작은
- 9. 캔버스 픽셀
- 10. 픽셀 차이
- 11. 범위
- 12. 범위
- 13. 범위
- 14. 범위
- 15. 범위
- 16. 범위
- 17. 범위
- 18. 범위
- 19. 범위
- 20. 범위
- 21. Excel 셀의 크기를 픽셀 단위로 가져옵니다.
- 22. IF 범위 내 기능 범위
- 23. 범위 밖의 시프트 암호 범위
- 24. System.Windows.Controls.Image의 픽셀 색상을 결정하는 방법은 무엇입니까?
- 25. SQL 값 범위 (int 범위, 날짜 범위, 무엇이든간에)
- 26. 변수 범위 지정
- 27. 통합 스크롤링 - "픽셀 별 픽셀"+ "항목 별 아이템"
- 28. 픽셀 단위로 픽셀 당 두 비트 맵 객체의 빠른 비교
- 29. iPhone - 이미지의 픽셀 블록을 다른 픽셀 블록으로 바꾸기
- 30. WPF DataGrid에서 연속 픽셀 간 픽셀 간격을 제로로 만드는 방법