Ð ÑÑой ÑÑаÑÑе ÑеÑÑ Ð¿Ð¾Ð¹Ð´ÑÑ Ð¾ докÑменÑиÑованнÑÑ
, но неÑаÑÑо иÑполÑзÑемÑÑ
обÑекÑаÑ
Range, TextRange и Selection. ÐÑ ÑаÑÑмоÑÑим волÑнÑй пеÑевод ÑпеÑиÑикаÑий Ñ Ð¿Ð¾Ð½ÑÑнÑми пÑимеÑами и ÑазлиÑнÑе кÑоÑÑбÑаÑзеÑнÑе ÑеализаÑии.
ÐÑа ÑÑаÑÑÑ Ð¿ÑедÑÑавлÑÐµÑ Ñобой обновлÑннÑй ваÑÐ¸Ð°Ð½Ñ ÑÑаÑÑи ÐлекÑандÑа ÐÑÑÑева, коÑоÑой Ñже Ð½ÐµÑ Ð¾Ð½Ð»Ð°Ð¹Ð½. ÐÑбликÑеÑÑÑ Ñ ÐµÐ³Ð¾ ÑазÑеÑениÑ, ÑпаÑибо, ÐлекÑандÑ!
Range
Range â ÑÑо обÑекÑ, ÑооÑвеÑÑÑвÑÑÑий ÑÑагменÑÑ Ð´Ð¾ÐºÑменÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ ÑÐ·Ð»Ñ Ð¸ ÑÑаÑÑки ÑекÑÑа из ÑÑого докÑменÑа. Ðаиболее подÑобно обÑÐµÐºÑ Range опиÑан в ÑпеÑиÑикаÑии DOM Range.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ Ð¾ Ñем ÑеÑÑ, обÑаÑимÑÑ Ðº ÑÐ°Ð¼Ð¾Ð¼Ñ Ð¿ÑоÑÑÐ¾Ð¼Ñ ÑлÑÑÐ°Ñ Range, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ñобно ÑаÑÑмоÑÑен ниже â к вÑделениÑм. РпÑиводимом ниже пÑимеÑе вÑделиÑе неÑколÑко Ñлов в пÑедложении. ÐÑÐ´ÐµÑ Ð²ÑводиÑÑÑÑ ÑекÑÑовое ÑодеÑжимое вÑделÑемой облаÑÑи:
Ðо Ñакие облаÑÑи можно ÑоздаваÑÑ Ð½Ðµ ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкого вÑделениÑ, но и из JavaScript-ÑÑенаÑиÑ, вÑполнÑÑ Ñ Ð½Ð¸Ð¼Ð¸ опÑеделÑннÑе манипÑлÑÑии. Ðднако, напиÑаÑÑ Ð¿ÑоÑÑой иллÑÑÑÑиÑÑÑÑий код ÑÑÐ°Ð·Ñ Ð½Ðµ вÑйдеÑ, Ñ.к. еÑÑÑ Ð¾Ð´Ð½Ð¾ ÐÐ â Internet Explorer до веÑÑии 9. Ð Microsoft Ñоздали ÑобÑÑвеннÑÑ ÑеализаÑÐ¸Ñ â обÑÐµÐºÑ TextRange. РазбеÑÑм каждÑÑ ÑеализаÑÐ¸Ñ Ð¿Ð¾ оÑделÑноÑÑи.
DOM-ÑеализаÑÐ¸Ñ Range (кÑоме IE8-)
Range ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ
гÑаниÑнÑÑ
ÑоÑек (boundary-points), ÑооÑвеÑÑÑвÑÑÑиÑ
наÑÐ°Ð»Ñ Ð¸ конÑÑ Ð¾Ð±Ð»Ð°ÑÑи. ÐозиÑÐ¸Ñ Ð»Ñбой гÑаниÑной ÑоÑки опÑеделÑеÑÑÑ Ð² докÑменÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð²ÑÑ
ÑвойÑÑв: Ñзел (node) и ÑмеÑение (offset).
ÐонÑейнеÑом (container) назÑваÑÑ Ñзел, ÑодеÑжаÑий гÑаниÑнÑÑ ÑоÑкÑ. Сам конÑÐµÐ¹Ð½ÐµÑ Ð¸ вÑе его пÑедки назÑваÑÑÑÑ ÑодиÑелÑÑкими конÑейнеÑами (ancestor containers) Ð´Ð»Ñ Ð³ÑаниÑной ÑоÑки. РодиÑелÑÑкий конÑейнеÑ, вклÑÑаÑÑий обе гÑаниÑнÑе ÑоÑки, назÑваÑÑ ÐºÐ¾ÑневÑм конÑейнеÑом (root container).
Ðа изобÑажении вÑÑе гÑаниÑнÑе ÑоÑки вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð»ÐµÐ¶Ð°Ñ Ð² ÑекÑÑовÑÑ
ÑзлаÑ
(#text1 и #text2), коÑоÑÑе ÑвлÑÑÑÑÑ ÐºÐ¾Ð½ÑейнеÑами. ÐÐ»Ñ Ð»ÐµÐ²Ð¾Ð¹ гÑаниÑÑ ÑодиÑелÑÑкими конÑейнеÑами ÑвлÑÑÑÑÑ #text1, H1, BODY, Ð´Ð»Ñ Ð¿Ñавой â #text2, P, BODY. ÐбÑий ÑодиÑÐµÐ»Ñ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ
гÑаниÑнÑÑ
ÑоÑек â BODY, ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑвлÑеÑÑÑ ÐºÐ¾ÑневÑм конÑейнеÑом.
ÐÑли конÑÐµÐ¹Ð½ÐµÑ ÑвлÑеÑÑÑ ÑекÑÑовÑм Ñзлом, Ñо ÑмеÑение опÑеделÑеÑÑÑ Ð² ÑимволаÑ
Ð¾Ñ Ð½Ð°Ñала DOM-Ñзла. ÐÑли конÑÐµÐ¹Ð½ÐµÑ ÑвлÑеÑÑÑ ÑлеменÑом (Document, DocumentFragment, Elementâ¦), Ñо ÑмеÑение опÑеделÑеÑÑÑ Ð² доÑеÑниÑ
ÑзлаÑ
.
СмоÑÑим на иллÑÑÑÑаÑÐ¸Ñ (иÑÑоÑник):
ÐÑаниÑнÑе ÑоÑки обÑекÑа Range s1 Ð»ÐµÐ¶Ð°Ñ Ð² ÑекÑÑовÑÑ
ÑзлаÑ
, поÑÑÐ¾Ð¼Ñ ÑмеÑение задаÑÑÑÑ Ð² ÑимволаÑ
Ð¾Ñ Ð½Ð°Ñала Ñзла. ÐÐ»Ñ s2 гÑаниÑнÑе ÑоÑки ÑаÑÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ñак, ÑÑо вклÑÑаÑÑ Ð²ÐµÑÑ Ð°Ð±Ð·Ð°Ñ <p>Blah xyz</p>, поÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑейнеÑом ÑвлÑеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ BODY, и ÑмеÑение ÑÑиÑаеÑÑÑ Ð² позиÑиÑÑ
доÑеÑниÑ
Ñзлов.
ÐбÑекÑÑ Range ÑоздаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзова document.createRange(). ÐбÑÐµÐºÑ Ð¿Ñи ÑÑом ÑоздаÑÑÑÑ Ð¿ÑÑÑой, и гÑаниÑнÑе ÑоÑки нÑжно задаÑÑ Ð´Ð°Ð»ÐµÐµ его меÑодами setStart и setEnd. СмоÑÑим пÑимеÑ.
HTML:
<div id="ex2">
<h2>Соз|даÑм обÑÐµÐºÑ Range</h2>
<p>ÐÑ ÑÑеÑÑе|го Ñимвола заголовка до деÑÑÑого Ñимвола ÑÑо абзаÑа.</p>
</div>
<button onclick="alert(domRangeCreate())">
СоздаÑÑ Range и вÑвеÑÑи его ÑекÑÑ
</button>
<script>
function domRangeCreate() {
// ÐайдÑм коÑневой конÑейнеÑ
var root = document.getElementById('ex2');
// ÐайдÑм конÑейнеÑÑ Ð³ÑаниÑнÑÑ
ÑоÑек (в данном ÑлÑÑае ÑеÑÑовÑе)
var start = root.getElementsByTagName('h2')[0].firstChild;
var end = root.getElementsByTagName('p')[0].firstChild;
if (root.createRange) {
// СоздаÑм Range
var rng = root.createRange();
// ÐадаÑм веÑÑ
нÑÑ Ð³ÑаниÑнÑÑ ÑоÑкÑ, пеÑедав конÑÐµÐ¹Ð½ÐµÑ Ð¸ ÑмеÑение
rng.setStart(start, 3);
// ÐналогиÑно Ð´Ð»Ñ Ð½Ð¸Ð¶Ð½ÐµÐ¹ гÑаниÑÑ
rng.setEnd(end, 10);
// ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ веÑнÑÑÑ ÑекÑÑ, коÑоÑÑй ÑодеÑжиÑÑÑ Ð² полÑÑенной облаÑÑи
return rng.toString();
} else {
return 'ÐеÑоÑÑно, Ñ Ð²Ð°Ñ IE8-, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ TextRange ниже';
}
}
</script>
РдейÑÑвии:
РаÑÑмоÑÑим вкÑаÑÑе ÑвойÑÑва и меÑÐ¾Ð´Ñ Range:
-
СвойÑÑво
commonAncestorContainerвеÑнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° наиболее вложеннÑй коÑневой конÑейнеÑ. -
СвойÑÑво
startContainer(endContainer) веÑнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° конÑÐµÐ¹Ð½ÐµÑ Ð²ÐµÑÑ Ð½ÐµÐ¹ (нижней) гÑаниÑной ÑоÑки. -
СвойÑÑво
startOffset(endOffset) веÑнÑÑ ÑмеÑение Ð´Ð»Ñ Ð²ÐµÑÑ Ð½ÐµÐ¹ (нижней) гÑаниÑной ÑоÑки. -
СвойÑÑво
collapsedвеÑнÑÑtrue, еÑли гÑаниÑнÑе ÑоÑки имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе конÑейнеÑÑ Ð¸ ÑмеÑение (falseв пÑоÑивном ÑлÑÑае). -
ÐеÑод
setStart(setEnd) задаÑÑ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ (ÑÑÑлка на Ñзел) и ÑмеÑение (ÑелоÑиÑленное знаÑение) Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð³ÑаниÑнÑÑ ÑоÑек. ÐÑÐ¸Ð¼ÐµÑ Ð²ÑÑе. -
ÐеÑодÑ
setStartBefore,setStartAfter,setEndBefore,setEndAfterпÑинимаÑÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа ÑÑÑÐ»ÐºÑ Ð½Ð° Ñзел и ÑÑÑанавливаÑÑ Ð³ÑаниÑнÑе ÑоÑки в ÑооÑв. Ñ ÐµÑÑеÑÑвенной гÑаниÑей пеÑеданного Ñзла. ÐапÑимеÑ:<span id="s1">First</span> <span id="s2">Second</span>var rng = document.createRange(); // УÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð²ÐµÑÑ Ð½ÑÑ Ð³ÑаниÑнÑÑ ÑоÑÐºÑ Ð¿Ð¾ левой гÑаниÑе Ñпана #s1 rng.setStartBefore(document.getElementById('s1')); // УÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑнÑÑ ÑоÑÐºÑ Ð¿Ð¾ пÑавой гÑаниÑе Ñпана #s2 rng.setEndAfter(document.getElementById('s2')); -
ÐеÑодÑ
selectNodeиselectNodeContentsпозволÑÑÑ ÑоздаÑÑ Ð¾Ð±ÑекÑRangeпо гÑаниÑам Ñзла, ÑÑÑÐ»ÐºÑ Ð½Ð° коÑоÑÑй они пÑинимаÑÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа. ÐÑи иÑполÑзованииselectNodeпеÑедаваемÑй Ñзел Ñакже войдÑÑ Ð²Range, в Ñо вÑÐµÐ¼Ñ ÐºÐ°ÐºselectNodeContentsÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ÑолÑко из ÑодеÑжимого Ñзла:
-
ÐеÑод
collapseобÑединÑÐµÑ Ð³ÑаниÑнÑе ÑоÑки обÑекÑаRange. РкаÑеÑÑве единÑÑвенного аÑгÑменÑа пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð±Ñлево знаÑение (trueâ Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² веÑÑ Ð½ÐµÐ¹ ÑоÑке,falseâ в нижней). Ðо ÑмолÑаниÑtrue. -
ÐеÑод
toStringвеÑнÑÑ ÑекÑÑовое ÑодеÑжимое обÑекÑаRange. -
ÐеÑод
cloneContentsвеÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑодеÑжимого обÑекÑаRangeв виде ÑÑагменÑа докÑменÑа. -
ÐеÑод
cloneRangeвеÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ñамого обÑекÑаRange. -
ÐеÑод
deleteContentsÑдалÑÐµÑ Ð²ÑÑ ÑодеÑжимое обÑекÑаRange. -
ÐеÑод
detachÐ¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑекÑÑий обÑÐµÐºÑ Ð¸Ð· DOM, Ñак ÑÑо на него болÑÑе нелÑÐ·Ñ ÑоÑлаÑÑÑÑ. -
ÐеÑод
insertNodeпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа ÑÑÑÐ»ÐºÑ Ð½Ð° Ñзел (или ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа) и вÑÑавлÑÐµÑ ÐµÐ³Ð¾ в ÑодеÑжимое обÑекÑаRangeв наÑалÑной ÑоÑке. -
ÐеÑод
extractContentsвÑÑÐµÐ·Ð°ÐµÑ ÑодеÑжимое обÑекÑаRangeи возвÑаÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° полÑÑеннÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа. -
ÐеÑод
surroundContentsпомеÑÐ°ÐµÑ Ð²ÑÑ ÑодеÑжимое ÑекÑÑего обÑекÑаRangeв новÑй ÑодиÑелÑÑкий ÑлеменÑ, ÑÑÑлка на коÑоÑÑй пÑинимаеÑÑÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа. -
ÐеÑод
compareBoundaryPointsиÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð³ÑаниÑнÑÑ ÑоÑек.
ÐÐ»Ñ Ð¿ÑимеÑа ÑеÑим неболÑÑÑÑ Ð·Ð°Ð´Ð°ÑкÑ. ÐайдÑм в ÑекÑÑовом Ñзле ÑÑÐ°Ð·Ñ Ð¸ подÑвеÑим ÐµÑ Ñиним Ñоном.
<div id="ex3">
ÐайдÑм в ÑÑом ÑекÑÑе Ñлово "бабÑлÑ" и подÑвеÑим его Ñиним Ñоном
</div>
<script>
function domRangeHighlight(text) {
// ÐолÑÑим ÑекÑÑовÑй Ñзел
var root = document.getElementById('ex3').firstChild;
// и его ÑодеÑжимое
var content = root.nodeValue;
// ÐÑовеÑим еÑÑÑ Ð»Ð¸ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑеданнÑм ÑекÑÑом
if (~content.indexOf(text)) {
if (document.createRange) {
// ÐÑли еÑÑÑ Ñовпадение, и бÑаÑÐ·ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Range, ÑоздаÑм обÑекÑ
var rng = document.createRange();
// СÑавим веÑÑ
нÑÑ Ð³ÑаниÑÑ Ð¿Ð¾ индекÑÑ ÑовпадениÑ,
rng.setStart(root, content.indexOf(text));
// а нижнÑÑ Ð¿Ð¾ индекÑÑ + длина ÑекÑÑа
rng.setEnd(root, content.indexOf(text) + text.length);
// СоздаÑм Ñпан Ñ Ñиним Ñоном
var highlightDiv = document.createElement('span');
highlightDiv.style.backgroundColor = 'blue';
// ÐбеÑнÑм Ð½Ð°Ñ Range в Ñпан
rng.surroundContents(highlightDiv);
} else {
alert( 'ÐеÑоÑÑно, Ñ Ð²Ð°Ñ IE8-, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ TextRange ниже' );
}
} else {
alert( 'Совпадений не найдено' );
}
}
</script>
РдейÑÑвии:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="ex3" style="border:1px dashed #999; color:#666; background:#EEE; padding:2px 5px; margin:10px 0;">
Ðайдем в ÑÑом ÑекÑÑе Ñлово "бабÑлÑ" и подÑвеÑим его Ñиним Ñоном
</div>
<div>
<input onclick="domRangehighlight('бабÑлÑ'); this.style.display = 'none';" type="button" value="ÐайÑи!">
</div>
<script>
function domRangehighlight(text) {
var root = document.getElementById('ex3').firstChild;
var content = root.nodeValue;
if (~content.indexOf(text)) {
if (document.createRange) {
var rng = document.createRange();
rng.setStart(root, content.indexOf(text));
rng.setEnd(root, content.indexOf(text) + text.length);
var highlightDiv = document.createElement('span');
highlightDiv.style.backgroundColor = 'blue';
rng.surroundContents(highlightDiv);
} else
alert('ÐеÑоÑÑно, Ñ Ð²Ð°Ñ IE8-, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ TextRange ниже');
} else
alert('Совпадений не найдено');
}
</script>
</body>
</html>С оÑÑалÑнÑми ÑвойÑÑвами и меÑодами поÑкÑпеÑименÑиÑÑйÑе Ñами. ÐеÑейдÑм к ÑеализаÑии range в IE.
TextRange (Ð´Ð»Ñ IE)
ÐбÑÐµÐºÑ TextRange в ÑеализаÑии MSIE â ÑÑо ÑекÑÑовÑй диапазон нÑлевой и более длинÑ. У данного диапазона Ñакже еÑÑÑ Ñвои гÑаниÑÑ, «пеÑемеÑаÑÑ» коÑоÑÑе можно на Ñелое ÑиÑло ÑекÑÑовÑÑ
единиÑ: character(Ñимвол), word (Ñлово), sentence (пÑедложение). То еÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ взÑÑÑ Ð¸ ÑдвинÑÑÑ Ð³ÑаниÑÑ Ð½Ð° 2(5, 8 и Ñ.д.) Ñлова (Ñимвола, пÑедложениÑ) впÑаво (влево). ÐÑи ÑÑом Ñ Ð¾Ð±ÑекÑа ÑоÑ
ÑанÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе о HTML-ÑодеÑжимом диапазона и еÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ñ DOM.
ÐбÑÐµÐºÑ TextRange ÑоздаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода createTextRange, коÑоÑÑй можно вÑзÑваÑÑ Ð² конÑекÑÑе ÑлеменÑов BODY, BUTTON, INPUT (болÑÑинÑÑво Ñипов), TEXTAREA.
ÐÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹:
<input id="buttonId" type="button" value="Test button" onclick="alert( ieTextRangeCreate() );" />
<script>
function ieTextRangeCreate() {
// ÐайдÑм кнопкÑ
var button = document.getElementById('buttonId');
// ÐÑли Ð¼Ñ Ð² ÐÐ
if (button.createTextRange && button.createTextRange() != undefined) {
// СоздаÑм TextRange
var rng = button.createTextRange();
// РвеÑнÑм ÑекÑÑовое ÑодеÑжимое полÑÑенного обÑекÑа
return rng.text;
} else {
return 'ÐеÑоÑÑно, Ñ Ð²Ð°Ñ Ð½Ðµ IE, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ Range вÑÑе';
}
}
</script>
РаÑÑмоÑÑим ÑвойÑÑва и меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа TextRange (не вÑе, ÑолÑко ÑамÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе):
-
СвойÑÑво
boundingWidth(boundingHeight) веÑнÑÑ ÑиÑÐ¸Ð½Ñ (вÑÑоÑÑ), коÑоÑÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ TextRange в пикÑелÑÑ . -
СвойÑÑво
boundingTop(boundingLeft) веÑнÑÑ Y(X)-кооÑдинаÑÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ левого Ñгла ÑеÑÑовой облаÑÑи оÑноÑиÑелÑно окна докÑменÑа. -
СвойÑÑво
htmlTextвеÑнÑÑ HTML-ÑодеÑжимое обÑекÑа. -
СвойÑÑво
textвеÑнÑÑ ÑекÑÑовое ÑодеÑжимое обÑекÑа (Ñм. пÑÐ¸Ð¼ÐµÑ Ð²ÑÑе). -
СвойÑÑво
offsetTop(offsetLeft) веÑнÑÑ Y(X)-кооÑдинаÑÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ левого Ñгла ÑеÑÑовой облаÑÑи оÑноÑиÑелÑно пÑедка. -
ÐеÑод
collapseобÑединÑÐµÑ Ð³ÑаниÑнÑе ÑоÑки диапазона. РкаÑеÑÑве единÑÑвенного аÑгÑменÑа пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð±Ñлево знаÑение (trueâ Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² веÑÑ Ð½ÐµÐ¹ ÑоÑке,falseâ в нижней). Ðо-ÑмолÑÐ°Ð½Ð¸Ñ true. -
ÐеÑод
duplicateклониÑÑÐµÑ Ð¸Ð¼ÐµÑÑийÑÑ ÑекÑÑовÑй диапазон, возвÑаÑÐ°Ñ Ð½Ð¾Ð²Ñй, ÑоÑно Ñакой же. -
ÐеÑод
expandÑаÑÑиÑÑÐµÑ ÑекÑÑий ÑекÑÑовÑй диапазон до единиÑÑ ÑекÑÑа, пеÑеданной в каÑеÑÑве единÑÑвенного ÑекÑÑового аÑгÑменÑа:"character'â Ñимвол."word"â Ñлово"sentence"â пÑедложение"textedit"â ÑвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¾ пеÑвонаÑалÑного диапазона.
ÐеÑнÑÑ
true(false) в ÑлÑÑае ÑÑÐ¿ÐµÑ Ð° (неÑдаÑи). -
ÐеÑод
findTextиÑÐµÑ Ð² диапазоне ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ñ ÑекÑÑовой ÑÑÑокой, пеÑедаваемой в каÑеÑÑве пеÑвого аÑгÑменÑа (без ÑÑÑÑа ÑегиÑÑÑа). ÐÑли Ñовпадение найдено, Ñо гÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° ÑвоÑаÑиваÑÑÑÑ Ð´Ð¾ него. РкаÑеÑÑве вÑоÑого (необÑзаÑелÑного) аÑгÑменÑа можно пеÑедаÑÑ Ñелое ÑиÑло, ÑказÑваÑÑее ÑиÑло Ñимволов Ð¾Ñ Ð²ÐµÑÑ Ð½ÐµÐ¹ ÑоÑки, в коÑоÑÑÑ Ð½Ñжно пÑоизводиÑÑ Ð¿Ð¾Ð¸Ñк. Ðалее в каÑеÑÑве аÑгÑменÑов можно пеÑеÑиÑлÑÑÑ INT-Ñлаги, коÑоÑÑе вам вÑÑд ли понадобÑÑÑÑ. -
ÐеÑод
getBookmarkвозвÑаÑÐ°ÐµÑ Ð² ÑлÑÑае ÑÑпеÑного вÑзова ÑÑÑокÑ, по коÑоÑой можно бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановиÑÑ ÑекÑÑее ÑоÑÑоÑние ÑекÑÑового диапазона Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑодаmoveToBookmark. -
ÐеÑод
inRangeпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа дÑÑгойTextRangeи пÑовеÑÑеÑ, Ð²Ñ Ð¾Ð´Ð¸Ñ Ð»Ð¸ его ÑекÑÑовÑй диапазон в диапазон конÑекÑÑного обÑекÑа. ÐозвÑаÑÐ°ÐµÑ Ð±Ñлево знаÑение. -
ÐеÑод
isEqualпÑовеÑÑÐµÑ ÑвлÑеÑÑÑ Ð»Ð¸ ÑекÑÑийTextRangeиденÑиÑнÑм пеÑÐµÐ´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² каÑеÑÑве аÑгÑменÑа. ÐозвÑаÑÐ°ÐµÑ Ð±Ñлево знаÑение. -
ÐеÑод
move(sUnit [, iCount])ÑвоÑаÑÐ¸Ð²Ð°ÐµÑ ÑекÑÑий диапазон до нÑлевой Ð´Ð»Ð¸Ð½Ñ Ð¸ пеÑÐµÐ´Ð²Ð¸Ð³Ð°ÐµÑ Ð½Ð° единиÑÑ ÑекÑÑа, пеÑеданного в каÑеÑÑве пеÑвого аÑгÑменÑа (character | word | sentence | textedit). РкаÑеÑÑве вÑоÑого (необÑзаÑелÑного) аÑгÑменÑа можно пеÑедаÑÑ ÑиÑло единиÑ, на коÑоÑое ÑледÑÐµÑ Ð¿ÐµÑедвинÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½. -
ÐеÑод
moveEnd(moveStart), аналогиÑно меÑÐ¾Ð´Ñ move, пеÑÐµÐ´Ð²Ð¸Ð³Ð°ÐµÑ Ð²ÐµÑÑ Ð½ÑÑ (нижнÑÑ) гÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° на единиÑÑ ÑекÑÑа, ÑиÑло коÑоÑÑÑ Ñакже можно задаÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм вÑоÑÑм паÑамеÑÑом. -
ÐеÑод
moveToElementTextпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа ÑÑÑÐ»ÐºÑ Ð½Ð° DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ вÑÑÑавлÑÐµÑ Ð³ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° TextобÑекÑаRangeпо гÑаниÑам полÑÑенного ÑлеменÑа. -
ÐеÑод
moveToPointпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве двÑÑ Ð¾Ð±ÑзаÑелÑнÑÑ Ð°ÑгÑменÑов X и Y-кооÑдинаÑÑ (в пикÑелÑÑ ) оÑноÑиÑелÑно веÑÑ Ð½ÐµÐ³Ð¾ левого Ñгла докÑменÑа и пеÑеноÑÐ¸Ñ Ð³ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° ÑÑда. -
ÐеÑод
parentElementвеÑнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑлеменÑ, коÑоÑÑй полноÑÑÑÑ ÑодеÑÐ¶Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ обÑекÑаTextRange(илиnull). -
ÐеÑод
pasteHTMLзаменÑÐµÑ HTML-ÑодеÑжимое ÑекÑÑего ÑекÑÑового диапазона на ÑÑÑокÑ, пеÑеданнÑÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа. -
ÐеÑод
selectÑоÑмиÑÑÐµÑ Ð²Ñделение на оÑнове ÑодеÑжимого обÑекÑаTextRange, о Ñем Ð¼Ñ Ð¿Ð¾Ð´Ñобнее поговоÑим ниже. -
ÐеÑод
setEndPointпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве обÑзаÑелÑнÑÑ Ð°ÑгÑменÑов ÑекÑÑовÑй ÑказаÑÐµÐ»Ñ Ð¸ ÑÑÑÐ»ÐºÑ Ð½Ð° дÑÑгойTextRange, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑказаÑÐµÐ»Ñ Ð³ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°. УказаÑели могÑÑ Ð±ÑÑÑ ÑледÑÑÑими: âStartToEndâ, âStartToStartâ, âEndToStartâ, âEndToEndâ.
Также к TextRange пÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼ÐµÑода execCommand, коÑоÑÑй ÑÐ¼ÐµÐµÑ Ð´ÐµÐ»Ð°ÑÑ ÑекÑÑ Ð¶Ð¸ÑнÑм, кÑÑÑивнÑм, копиÑоваÑÑ ÐµÐ³Ð¾ в бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð° (ÑолÑко IE) и Ñ.п.
ÐÐ»Ñ Ð·Ð°ÐºÑÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ñделаем задаÑÐºÑ Ð¿Ð¾ поиÑÐºÑ ÑекÑÑового ÑодеÑжимого, аналогиÑнÑÑ Ñой, ÑÑо бÑла вÑÑе:
<div id="ex4">
ÐайдÑм в ÑÑом ÑекÑÑе Ñлово "бабÑлÑ" и подÑвеÑим его Ñиним Ñоном
</div>
<script>
function ieTextRangeHighlight(text) {
// ÐолÑÑим ÑÑÑÐ»ÐºÑ Ð½Ð° ÑлеменÑ, в коÑоÑом бÑÐ´ÐµÑ Ð¿ÑоиÑÑ
одиÑÑ Ð¿Ð¾Ð¸Ñк
var root = document.getElementById('ex4');
// ÐолÑÑим знаÑение его ÑекÑÑового поÑомка
var content = root.firstChild.nodeValue;
// ÐÑли еÑÑÑ Ñовпадение
if (~content.indexOf(text)) {
// и Ð¼Ñ Ð² MSIE
if (document.body.createTextRange) {
// Создадим обÑÐµÐºÑ TextRange
var rng = document.body.createTextRange();
// СвеÑнÑм его до root
rng.moveToElementText(root);
// ÐайдÑм ÑекÑÑ Ð¸ ÑвеÑнÑм диапазон до него
if (rng.findText(text))
// Ðаменим ÑекÑÑовÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ð° span Ñ Ñиним Ñоном
rng.pasteHTML('<span style="background:blue;">' + text + '</span>');
} else {
alert( 'ÐеÑоÑÑно, Ñ Ð²Ð°Ñ Ð½Ðµ IE, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ Range вÑÑе' );
}
} else {
alert( 'Совпадений не найдено' );
}
}
</script>
РдейÑÑвии:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="ex4" style="border:1px dashed #999; color:#666; background:#EEE; padding:2px 5px; margin:10px 0;">
Ðайдем в ÑÑом ÑекÑÑе Ñлово "бабÑлÑ" и подÑвеÑим его Ñиним Ñоном
</div>
<div>
<input onclick="ieTextRangeHighlight('бабÑлÑ'); this.style.display = 'none';" type="button" value="ÐайÑи!">
</div>
<script>
function ieTextRangeHighlight(text) {
var root = document.getElementById('ex4');
var content = root.firstChild.nodeValue;
if (~content.indexOf(text)) {
if (document.body.createTextRange) {
var rng = document.body.createTextRange();
rng.moveToElementText(root);
if (rng.findText(text))
rng.pasteHTML('<span style="background:blue;">' + text + '</span>');
} else
alert('ÐеÑоÑÑно, Ñ Ð²Ð°Ñ Ð½Ðµ IE, ÑмоÑÑиÑе ÑеализаÑÐ¸Ñ Range вÑÑе');
} else
alert('Совпадений не найдено');
}
</script>
</body>
</html>С оÑÑалÑнÑми ÑвойÑÑвами и меÑодами поÑкÑпеÑименÑиÑÑйÑе Ñами.
Selection
ÐÑем знакомо вÑделение ÑлеменÑов на ÑÑÑаниÑе, когда, зажав левÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¼ÑÑи и пеÑÐµÐ´Ð²Ð¸Ð³Ð°Ñ ÐºÑÑÑоÑ, Ð¼Ñ Ð²ÑделÑем нÑжнÑй ÑÑагменÑ. Ðли зажимаем Shift и жмÑм на ÑÑÑелоÑки клавиаÑÑÑÑ. Ðли еÑÑ ÐºÐ°Ðº-Ñо, неважно. Рданной ÑаÑÑи ÑÑаÑÑи Ð¼Ñ ÐºÑоÑÑбÑаÑзеÑно наÑÑимÑÑ ÑеÑаÑÑ Ð´Ð²Ðµ задаÑи: полÑÑаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкое вÑделение и ÑÑÑанавливаÑÑ ÑобÑÑвенное.
ÐолÑÑаем полÑзоваÑелÑÑкое вÑделение
ÐÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð¼Ñ Ñже ÑеÑали в Ñамом наÑале ÑÑаÑÑи в пÑимеÑе Ñ Ð¼Ð¸ÐºÑом. ТепеÑÑ ÑаÑÑмоÑÑим код:
function getSelectionText() {
var txt = '';
if (txt = window.getSelection) { // Ðе IE, иÑполÑзÑем меÑод getSelection
txt = window.getSelection().toString();
} else { // IE, иÑполÑзÑем обÑÐµÐºÑ selection
txt = document.selection.createRange().text;
}
return txt;
}
ÐÑе бÑаÑзеÑÑ, кÑоме IE8- поддеÑживаÑÑ Ð¼ÐµÑод window.getSelection(), коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ, ÑÑ
ожий Ñ ÑаÑÑмоÑÑеннÑм Ñанее Range. У ÑÑого обÑекÑа еÑÑÑ ÑоÑка наÑала вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ (anchor) и ÑокÑÑÐ½Ð°Ñ ÑоÑка оконÑÐ°Ð½Ð¸Ñ (focus). ТоÑки могÑÑ ÑовпадаÑÑ. РаÑÑмоÑÑим ÑвойÑÑва и меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа Selection:
- СвойÑÑво
anchorNodeвеÑнÑÑ ÐºÐ¾Ð½ÑейнеÑ, в коÑоÑом наÑинаеÑÑÑ Ð²Ñделение. ÐамеÑÑ, ÑÑо наÑалом вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑиÑаеÑÑÑ Ñа гÑаниÑа, Ð¾Ñ ÐºÐ¾ÑоÑой Ð²Ñ Ð½Ð°Ñали вÑделение. То еÑÑÑ, еÑли Ð²Ñ Ð²ÑделÑеÑе ÑпÑава налево, Ñо наÑалом бÑÐ´ÐµÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ пÑÐ°Ð²Ð°Ñ Ð³ÑаниÑа. ÐÑо пÑавило ÑабоÑÐ°ÐµÑ Ð²ÐµÐ·Ð´Ðµ, кÑоме бÑаÑзеÑа Opera, в коÑоÑомanchorNodeвеÑнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° Ñзел левого кÑÐ°Ñ Ð²ÑделениÑ. - СвойÑÑво
anchorOffsetвеÑнÑÑ ÑмеÑение Ð´Ð»Ñ Ð½Ð°Ñала вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² пÑÐµÐ´ÐµÐ»Ð°Ñ ÐºÐ¾Ð½ÑейнеÑаanchorNode. - СвойÑÑва
focusNodeиfocusOffsetÑабоÑаÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно Ð´Ð»Ñ ÑокÑÑнÑÑ ÑоÑек, Ñо еÑÑÑ ÑоÑек оконÑÐ°Ð½Ð¸Ñ Ð²ÑделениÑ. Opera и здеÑÑ Ð¾ÑлиÑилаÑÑ, возвÑаÑÐ°ÐµÑ Ð²Ð¼ÐµÑÑо ÑокÑÑной ÑоÑки Ñзел пÑавого кÑÐ°Ñ Ð²ÑделениÑ. - СвойÑÑво
rangeCountвозвÑаÑÐ°ÐµÑ ÑиÑло обÑекÑовRange, коÑоÑÑе Ð²Ñ Ð¾Ð´ÑÑ Ð² полÑÑенное вÑделение. ÐÑо ÑвойÑÑво полезно пÑи иÑполÑзовании меÑодаaddRange. - ÐеÑод
getRangeAtпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа Ð¸Ð½Ð´ÐµÐºÑ Ð¾Ð±ÑекÑаRangeи возвÑаÑÐ°ÐµÑ Ñам обÑекÑ. ÐÑлиrangeCount == 1, Ñо ÑабоÑаÑÑ Ð±ÑÐ´ÐµÑ ÑолÑкоgetRangeAt(0). Таким обÑазом, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð¾Ð±ÑекÑRange, полноÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑекÑÑÐµÐ¼Ñ Ð²ÑделениÑ. - ÐеÑод
collapseÑвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ñделение в ÑоÑÐºÑ (каÑеÑкÑ). ÐеÑÐ¾Ð´Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑедаÑÑ Ð² каÑеÑÑве пеÑвого аÑгÑменÑа Ñзел, в коÑоÑÑй нÑжно помеÑÑиÑÑ ÐºÐ°ÑеÑкÑ. - ÐеÑод
extendпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑов ÑÑÑÐ»ÐºÑ Ð½Ð° конÑÐµÐ¹Ð½ÐµÑ Ð¸ ÑмеÑение (parentNode,offset), и пеÑемеÑÐ°ÐµÑ ÑокÑÑнÑÑ ÑоÑÐºÑ Ð² ÑÑо положение. - ÐеÑод
collapseToStart(collapseToEnd) пеÑемеÑÐ°ÐµÑ ÑокÑÑнÑÑ (наÑалÑнÑÑ) гÑаниÑÑ Ðº наÑалÑной (ÑокÑÑной), Ñем ÑамÑм ÑвоÑаÑÐ¸Ð²Ð°Ñ Ð²Ñделение в каÑеÑкÑ. - ÐеÑод
selectAllChildrenпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве единÑÑвенного аÑгÑменÑа ÑÑÑÐ»ÐºÑ Ð½Ð° Ñзел и добавлÑÐµÑ Ð²ÑÐµÑ ÐµÐ³Ð¾ поÑомков в вÑделение. - ÐеÑод
addRangeпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа обÑекÑRangeи добавлÑÐµÑ ÐµÐ³Ð¾ в вÑделение. Таким обÑазом можно ÑвелиÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво обÑекÑовRange, ÑиÑло коÑоÑÑÑ Ð½Ð°Ð¼ подÑÐºÐ°Ð¶ÐµÑ ÑвойÑÑвоrangeCount. - ÐеÑод
removeRange(removeAllRanges) ÑдалÑÐµÑ Ð¿ÐµÑеданнÑй (вÑе) обÑекÑRangeиз вÑделениÑ. - ÐеÑод
toStringвеÑнÑÑ ÑекÑÑовое ÑодеÑжимое вÑделениÑ.
IE пÑедоÑÑавлÑÐµÑ ÑобÑÑвеннÑй инÑеÑÑÐµÐ¹Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ñ Ð²ÑделениÑми â обÑÐµÐºÑ selection в конÑекÑÑе document. ÐÐ»Ñ ÑабоÑÑ Ñ ÑÑим обÑекÑом иÑполÑзÑÑÑÑÑ ÑледÑÑÑие меÑодÑ:
- ÐеÑод
clearÑбиÑÐ°ÐµÑ Ð²Ñделение вмеÑÑе Ñ ÑодеÑжимÑм. - ÐеÑод
createRange(ÐÐÐÐÐ! Ðе пÑÑаÑÑ Ñо ÑÑандаÑÑнÑм меÑодомdocument.createRange()Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑовRange!) ÑоздаÑÑ Ð¸Ð· ÑодеÑжимого вÑделениÑTextRange. - ÐеÑод
emptyÑбиÑÐ°ÐµÑ Ð²Ñделение, но оÑÑавлÑÐµÑ ÑодеÑжимое.
ÐадеÑÑÑ, ÑепеÑÑ, поÑле знакомÑÑва Ñ Ð¾Ð±ÐµÐ¸Ð¼Ð¸ ÑеализаÑиÑми вÑделений, код вÑÑе ÑÑал более понÑÑен.
УÑÑановка ÑобÑÑвенного вÑделениÑ
ÐопÑÑÑим, вам Ñ Ð¾ÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÐºÐ°ÐºÐ¾Ð¹-Ñо ÑекÑÑовÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ð° ÑÑÑаниÑе бÑл вÑделен, как полÑзоваÑелÑÑкое вÑделение. ÐÑо нÑжно пÑи клиенÑÑкой ÑеализаÑии поиÑка по ÑÑÑаниÑе и некоÑоÑÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð·Ð°Ð´Ð°Ñ.
ÐÑоÑе вÑего ÑеÑиÑÑ ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ ÑледÑÑÑим обÑазом:
- СоздаÑÑ Ð¾Ð±ÑекÑ
Range(TextRangeÐ´Ð»Ñ IE8-). - ÐеÑевеÑÑи полÑÑеннÑй обÑÐµÐºÑ Ð² вÑделение.
СмоÑÑим ÑеализаÑиÑ:
<div id="ex5">
Снова бÑдем вÑделÑÑÑ <span>бабÑлÑ</span>, на ÑÑÐ¾Ñ Ñаз без поиÑка.
</div>
<script>
function setSelection() {
var target = document.getElementById('ex5').getElementsByTagName('span')[0];
var rng, sel;
if (document.createRange) {
rng = document.createRange();
rng.selectNode(target)
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(rng);
} else {
var rng = document.body.createTextRange();
rng.moveToElementText(target);
rng.select();
}
}
</script>
РдейÑÑвии:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="ex5" style="border:1px dashed #999; color:#666; background:#EEE; padding:2px 5px; margin:10px 0;">
Снова бÑдем вÑделÑÑÑ <span>бабÑлÑ</span>, на ÑÑÐ¾Ñ Ñаз без поиÑка.
</div>
<div>
<input onclick="setSelection()" type="button" value="ÐÑделиÑÑ Ð±Ð°Ð±ÑлÑ">
</div>
<script>
function setSelection() {
var target = document.getElementById('ex5').getElementsByTagName('span')[0];
var rng, sel;
if (document.createRange) {
rng = document.createRange();
rng.selectNode(target)
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(rng);
} else {
var rng = document.body.createTextRange();
rng.moveToElementText(target);
rng.select();
}
}
</script>
</body>
</html>СнÑÑие вÑделениÑ
Ðод Ð´Ð»Ñ ÑнÑÑÐ¸Ñ Ð²ÑделениÑ, иÑполÑзÑÑÑий ÑооÑвеÑÑÑвÑÑÑие меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑов Selection:
function clearSelection() {
try {
// ÑовÑеменнÑй обÑÐµÐºÑ Selection
window.getSelection().removeAllRanges();
} catch (e) {
// Ð´Ð»Ñ IE8-
document.selection.empty();
}
}
ÐÑого
- Ð ÑовÑеменнÑÑ Ð±ÑаÑзеÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ ÑÑандаÑÑнÑй обÑÐµÐºÑ Range
- Ð IE8- поддеÑживаеÑÑÑ ÑолÑко ÑобÑÑвеннÑй обÑÐµÐºÑ TextRange.
ÐÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, коÑоÑÑе «иÑпÑавлÑÑÑ» обÑÐµÐºÑ TextRange, добавлÑÑ ÐµÐ¼Ñ Ð½ÑжнÑе ÑвойÑÑва из Range.
Ðод, полÑÑаÑÑий вÑделение, пÑи иÑполÑзовании Ñакой библиоÑеки Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
var range = getRangeObject();
if (range) {
alert( range );
alert( range.startContainer.nodeValue );
alert( range.startOffset );
alert( range.endOffset );
} else {
alert( 'ÐиÑего не вÑделено' );
}
}
РдейÑÑвии:
/*
This code is to fix Microsoft TextRange object (IE8 and below), to give equivalent of
HTML5 Range object's startContainer,startOffset,endContainer and endOffset properties.
Originally from: https://gist.github.com/1115251 (Munnawwar)
*/
/**
* @param {window object} [win] Optional prameter. You could send an IFrame.contentWindow too.
*/
function fixIERangeObject(range, win) { //Only for IE8 and below.
win = win || window;
if (!range) return null;
if (!range.startContainer && win.document.selection) { //IE8 and below
var _findTextNode = function(parentElement, text) {
//Iterate through all the child text nodes and check for matches
//As we go through each text node keep removing the text value (substring) from the beginning of the text variable.
var container = null,
offset = -1;
for (var node = parentElement.firstChild; node; node = node.nextSibling) {
if (node.nodeType == 3) { //Text node
var find = node.nodeValue;
var pos = text.indexOf(find);
if (pos == 0 && text != find) { //text==find is a special case
text = text.substring(find.length);
} else {
container = node;
offset = text.length - 1; //Offset to the last character of text. text[text.length-1] will give the last character.
break;
}
}
}
//Debug Message
//alert(container.nodeValue);
return {
node: container,
offset: offset
}; //nodeInfo
}
var rangeCopy1 = range.duplicate(),
rangeCopy2 = range.duplicate(); //Create a copy
var rangeObj1 = range.duplicate(),
rangeObj2 = range.duplicate(); //More copies :P
rangeCopy1.collapse(true); //Go to beginning of the selection
rangeCopy1.moveEnd('character', 1); //Select only the first character
rangeCopy2.collapse(false); //Go to the end of the selection
rangeCopy2.moveStart('character', -1); //Select only the last character
//Debug Message
// alert(rangeCopy1.text); //Should be the first character of the selection
var parentElement1 = rangeCopy1.parentElement(),
parentElement2 = rangeCopy2.parentElement();
//If user clicks the input button without selecting text, then moveToElementText throws an error.
if (parentElement1 instanceof HTMLInputElement || parentElement2 instanceof HTMLInputElement) {
return null;
}
rangeObj1.moveToElementText(parentElement1); //Select all text of parentElement
rangeObj1.setEndPoint('EndToEnd', rangeCopy1); //Set end point to the first character of the 'real' selection
rangeObj2.moveToElementText(parentElement2);
rangeObj2.setEndPoint('EndToEnd', rangeCopy2); //Set end point to the last character of the 'real' selection
var text1 = rangeObj1.text; //Now we get all text from parentElement's first character upto the real selection's first character
var text2 = rangeObj2.text; //Here we get all text from parentElement's first character upto the real selection's last character
var nodeInfo1 = _findTextNode(parentElement1, text1);
var nodeInfo2 = _findTextNode(parentElement2, text2);
//Finally we are here
range.startContainer = nodeInfo1.node;
range.startOffset = nodeInfo1.offset;
range.endContainer = nodeInfo2.node;
range.endOffset = nodeInfo2.offset + 1; //End offset comes 1 position after the last character of selection.
}
return range;
}
function getRangeObject(win) { //Gets the first range object
win = win || window;
if (win.getSelection) { // Firefox/Chrome/Safari/Opera/IE9
try {
return win.getSelection().getRangeAt(0); //W3C DOM Range Object
} catch (e) { /*If no text is selected an exception might be thrown*/ }
} else if (win.document.selection) { // IE8
var range = win.document.selection.createRange(); //Microsoft TextRange Object
return fixIERangeObject(range, win);
}
return null;
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="fixIERangeObject.js"></script>
<script>
function test() {
var range = getRangeObject();
if (range) {
alert(range);
alert(range.startContainer.nodeValue);
alert(range.startOffset);
alert(range.endOffset);
} else {
alert('СнаÑала вÑделиÑе ÑекÑÑ');
}
}
</script>
</head>
<body>
ÐÑделиÑе ÑекÑÑ:
<pre>The quick brown fox jumped over the lazy dog</pre>
<input type="button" value="ÐÑвеÑÑи вÑделение и ÑвойÑÑва startContainer, startOffset, endOffset" onclick="test();" />
</body>
</html>Ðод ÑÑнкÑий getRangeObject(win) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² окне и fixIERangeObject(range, win) Ð´Ð»Ñ Ð¸ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ TextRange â в пеÑоÑниÑе вмеÑÑе Ñ ÑÑим пÑимеÑом.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)