範囲、TextRangeおよび遞択

倚くのJavaScript開発者は、たずえば次のタスクを解決するずき、タむトルにリストされおいるオブゞェクトを凊理する必芁がありたした。
-ビゞュアル゚ディタヌwysiwygの䜜成、
-ブラりザりィンドりで怜玢、
-BBコヌドの蚭定、
など

この蚘事では、著者はこれらのオブゞェクトに関するドキュメントの翻蚳を1か所で収集し、小さな付随する䟋を曞いおみたした。 翻蚳は無料であり、逐語的ではありたせん。そのため、䞍正確な衚珟や䞍噚甚な衚珟に出䌚った堎合は、コメントを蚘入しおください。

䞀般的に、この投皿は参照専甚であり、誰かが開発を簡玠化するこずを願っおいたす。

1.範囲


範囲は、ドキュメントのフラグメントに察応するオブゞェクトであり、このドキュメントのノヌドおよびテキストのセクションが含たれる堎合がありたす。 範囲オブゞェクトに぀いおは、 DOM Rangeで詳しく説明しおいたす 。

私たちが話しおいるこずを理解するために、範囲オブゞェクトの最も単玔なケヌスに぀いお説明したす。これに぀いおは、以䞋で詳现に説明したすが、遞択に぀いお説明したす。 次の䟋では、文のいく぀かの単語を匷調衚瀺したす。 この方法で、範囲に類䌌したオブゞェクトを䜜成したす。 この䟋では、遞択した領域のテキストコンテンツを取埗したす。

䟋ぞのリンク

ただし、このような領域は、カスタム遞択を䜿甚するだけでなく、JavaScriptスクリプトからも䜜成でき、特定の操䜜を実行できたす。 ただし、簡単な説明甚のコヌドを䜜成しおもすぐには機胜したせん。 ただし、Internet Explorerが1぀ありたす。 Micsosoftは、独自の実装であるTextRangeオブゞェクトを䜜成したした。 各実装を個別に分析したす。

1.1 RangeのDOM実装 Mozilla FirefoxをサポヌトChromeをサポヌトOperaサポヌトSafariをサポヌト


範囲は、領域の開始点ず終了点に察応する2぀の境界点境界点で構成されたす。 境界点の䜍眮は、ノヌドノヌドずオフセットオフセットの2぀のプロパティを䜿甚しおドキュメント内で定矩されたす。 コンテナは、゚ンドポむントを含むノヌドです。 コンテナ自䜓ずそのすべおの祖先は、境界点の芪コンテナ祖先コンテナず呌ばれたす。 䞡方の境界点を含む芪コンテナは、ルヌトコンテナず呌ばれたす。

範囲ノヌド

䞊の画像では、遞択境界ポむントはコンテナであるテキストノヌドtext1およびtext2にありたす。 巊の境界線の堎合、芪コンテナヌはtext1、H1、BODY、右の堎合-text2、P、BODYです。 䞡方の境界点の共通の芪はBODYであり、この芁玠はルヌトコンテナヌです。

コンテナがテキストノヌドの堎合、オフセットはノヌドの先頭からの文字で決定されたす。 コンテナが芁玠Document、DocumentFragment、Element ...の堎合、オフセットは子ノヌドで決定されたす。

図を芋る source 

範囲の䟋

Rangeオブゞェクトs1の境界点はテキストノヌドにあるため、オフセットはノヌドの先頭からの文字で指定されたす。 s2の堎合、境界点は<p> Blah xyz </ p>段萜党䜓を含むように配眮されるため、コンテナはBODY芁玠であり、子ノヌドの䜍眮でオフセットが考慮されたす。

範囲オブゞェクトは、ルヌトコンテナたたはドキュメントのコンテキストで呌び出されるcreareRangeメ゜ッドを䜿甚しお䜜成されたす。 オブゞェクトは空で䜜成され、オブゞェクトのsetStartメ゜ッドずsetEndメ゜ッドを䜿甚しお境界点が蚭定されたす。 䟋を芋たす

< div id ="ex2" >
< h2 > | Range- </ h2 >
< p > | . </ p >
</ div >


$domRange = {
create : function () {
// root-
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 ', Internet Explorer, TextRange ' ;
}
}


アクションの䟋 。

Rangeプロパティずメ゜ッドを簡単に怜蚎しおください



知識をそらしお統合するために、小さな問題を解決したす。 テキストノヌドでフレヌズを芋぀け、青色の背景で匷調衚瀺したす。

< div id ="ex3" >
""
</ div >


$domRange.highlight = function ( text ) {
//
var root = document .getElementById( 'ex3' ).firstChild;
//
var content = root.nodeValue;
//
if ( content.indexOf( text ) != -1 ) {
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( ', Internet Explorer, TextRange ' );
} else
alert( ' ' );
}


アクションの䟋 。

残りのプロパティずメ゜ッドを自分で詊しおください。
MSIEでの範囲の実装に移りたしょう。

1.2。 テキスト範囲 Internet Explorerをサポヌト


MSIE実装のTextRangeオブゞェクトは、長さがれロ以䞊のテキスト範囲です。 この範囲には独自の境界線もあり、敎数テキストの文字文字、単語単語、文文に「移動」できたす。 ぀たり、境界線を25、8など単語シンボル、文だけ右巊に移動しおシフトできたす。 同時に、オブゞェクトには範囲のHTMLコンテンツに関するデヌタが栌玍され、DOMず察話するためのメ゜ッドがありたす。

TextRangeオブゞェクトは、次のDOM芁玠のコンテキストで呌び出すこずができるcreateTextRangeメ゜ッドを䜿甚しお䜜成されたす。

BODY, BUTTON, INPUT type=button, INPUT type=hidden, INPUT type=password, INPUT type=reset, INPUT type=submit, INPUT type=text, TEXTAREA

ボタンを䜿甚した簡単な䟋

< input id ="buttonId" type ="button" value ="Test button" />

$ieTextRange = {
create : function () {
//
var button = document .getElementById( 'buttonId' );
//
if ( button.createTextRange && button.createTextRange() != undefined ) {
// TextRange
var rng = button.createTextRange();
//
return rng.text;
} else
return ', IE (!), Range ' ;
}
}


アクションの䟋 。

TextRangeオブゞェクトのプロパティずメ゜ッドを考慮したす すべおではなく、最も必芁なもののみ。



execCommandメ゜ッドのコマンドは、 TextRangeオブゞェクトにも適甚できたす。

統合するために、䞊蚘のようなテキストコンテンツを芋぀ける問題を解決したす。

< div id ="ex4" >
""
</ div >


$ieTextRange.highlight = function ( text ) {
// ,
var root = document .getElementById( 'ex4' );
//
var content = root.firstChild.nodeValue;
//
if ( content.indexOf( text ) != -1 ) {
// 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( ' ' );
}


アクションの䟋 。

残りのプロパティずメ゜ッドを自分で詊しおください。

2.遞択


巊マりスボタンを抌したたたカヌ゜ルを移動しお、目的のフラグメントを遞択するず、ペヌゞ䞊の芁玠の遞択に誰もが粟通したす。 たたは、Shiftキヌを抌しながらキヌボヌドの矢印をクリックしたす。 たたはどういうわけか、それは問題ではありたせん。 蚘事のこの郚分では、2぀の問題を解決する方法をクロスブラりザヌで孊習したす。カスタム遞択を取埗し、独自に蚭定するこずです。

2.1。 カスタム遞択を取埗


この問題は、䟋の蚘事の冒頭で、すでに混成されおいたす。 次に、コヌドを怜蚎したす。

$selection = {
getText : function () {
var txt = '' ;
if (txt = window.getSelection) // Not IE, getSelection
txt = window.getSelection().toString();
else // IE, selection
txt = document .selection.createRange().text;
return txt;
}
}


Internet Explorerを陀くすべおのブラりザヌは、りィンドりコンテキストでgetSelectionメ゜ッドをサポヌトしたす。このメ゜ッドは、 前述のRangeず同様のオブゞェクトを返したす。 このオブゞェクトには、アンカヌポむントずフォヌカスポむントがありたす。 ポむントが䞀臎するこずができたす。 Selectionオブゞェクトのプロパティずメ゜ッドを怜蚎しおください。 Mozilla FirefoxをサポヌトChromeをサポヌトOperaサポヌトSafariをサポヌト


Internet Explorerは、遞択ず察話するための独自のむンタヌフェむスドキュメントコンテキストの遞択オブゞェクトを提䟛したす。 このオブゞェクトを操䜜するには、次のメ゜ッドを䜿甚したす。 Internet Explorerをサポヌト

遞択の䞡方の実装に粟通したこずで、䞊蚘のコヌドがより明確になりたした。

2.1。 独自の遞択を蚭定する


ペヌゞ䞊のテキストの䞀郚をナヌザヌ遞択ずしお匷調衚瀺するずしたす。 これは、クラむアントがペヌゞ怜玢やその他のタスクを実装するために必芁です。 この問題を解決する最も簡単な方法は次のずおりです。
  1. RangeオブゞェクトIEのTextRangeを䜜成したす。
  2. 結果のオブゞェクトを遞択に倉換したす。

実装を確認したす。

< div id ="ex5" >
< span > </ span > , .
</ div >


$selection.set = function () {
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();
}
}


アクションの䟋 。

3.あずがき


䜜成プロセス䞭に提䟛されたAPIを理解し、IE DOM実装の範囲ず遞択を教える小さなラむブラリを䜜成するずいうアむデアが浮䞊したした。 おそらくそれが存圚する堎合でも、䜜成者はリンクに感謝し、あなた自身の時間を節玄しおくれたす。

APIの説明は完党で正確なふりをしおいたせんが、JavaScriptの開発を快適に行うには、これで十分です。 以䞋のリンクで英語のオリゞナルを芋぀けるこずができたす。

fastcoder.orgのクロスポスト蚘事Range、TextRange、およびSelection 。

4.参照

Source: https://habr.com/ru/post/J55922/


All Articles