- if( isPoint ){\r
- // TextNode をフラットな配列に回収\r
- X_TextRange_collectTextNodes( elm, texts = [] ); \r
- \r
- for( i = offset = 0; text = texts[ i ]; ++i ){\r
- range.selectNodeContents( text ); // selectNodeContents は TextNode のみ?? Firefox\r
- l = text.data.length;\r
-\r
- for( j = 0, x = tr.v1, y = tr.v2; j < l; ++j ){\r
- if( range ){\r
- range.setStart( text, j );\r
- range.setEnd( text, j + 1 );\r
- rect = range.getBoundingClientRect();\r
- };\r
- if( rect.left <= x && x <= rect.right && rect.top <= y && y <= rect.bottom ){\r
- return {\r
- 'hitRange' : range,\r
- 'rect' : rect,\r
- 'offset' : offset,\r
- 'text' : text\r
- };\r
- };\r
- };\r
- offset += l;\r
- };\r
- range = null;\r
- } else {\r
- // 未チェック!\r
- range.setEnd( elm, l < tr.v2 ? l : tr.v2 );\r
- range.setStart( elm, tr.v1 );\r
- return { 'hitRange' : range };\r
+ for( j = 0; j < l; ++j ){\r
+ if( X_UA[ 'IE' ] || X_UA[ 'Edge' ] ){\r
+ // 改行の直前の文字を選択すると rect が巨大になってしまう\r
+ range.setEnd( text, j );\r
+ range.setStart( text, j );\r
+ rect = range.getBoundingClientRect();\r
+ top = rect.top;\r
+ btm = rect.bottom;\r
+ left = rect.left;\r
+ range.setEnd( text, j + 1 );\r
+ rect = range.getBoundingClientRect();\r
+ \r
+ if( rect.left < left ){\r
+ //console.log( '= ', text.data.charAt( j ), ' x:', x, ' y:', y, ' top:', top | 0, ' left:', left | 0, ' bottom:', btm | 0, ' right:', rect.right | 0 );\r
+ if( left <= x && x <= rect.right && top <= y && y <= btm ){\r
+ return {\r
+ 'hitRange' : range, // TODO startContainer, endContainer\r
+ 'rect' : rect,\r
+ 'offset' : offset,\r
+ 'text' : text // TODO xtext じゃないの?\r
+ };\r
+ };\r
+ continue;\r
+ };\r
+ } else {\r
+ range.setEnd( text, j + 1 );\r
+ range.setStart( text, j );\r
+ rect = range.getBoundingClientRect();\r
+ };\r
+ \r
+ //console.log( text.data.charAt( j ), ' x:', x, ' y:', y, ' top:', rect.top | 0, ' left:', rect.left | 0, ' bottom:', rect.bottom | 0, ' right:', rect.right | 0 );\r
+ if( rect.left <= x && x <= rect.right && rect.top <= y && y <= rect.bottom ){\r
+ return {\r
+ 'hitRange' : range, // TODO startContainer, endContainer\r
+ 'rect' : rect,\r
+ 'offset' : offset,\r
+ 'text' : text // TODO xtext じゃないの?\r
+ };\r
+ };\r
+ };\r
+ offset += l;\r