- 更新日: 2014年12月5日
- 開発記録
JavaScriptでcollapsed rangeオブジェクトを可視化するツールを作った
JavaScript で、クリックやマウスオーバーのイベントで、カーソル直下の文字列を取得するコードを書いていました。DOM における collapsed range のオブジェクトを操作するのですけど、概念を掴むのがなかなか難しかった。collapsed range オブジェクトとは、range オブジェクトのうち range の始点と終点が同じ位置であり、range.collapsed プロパティが true を返す range オブジェクトのことです。
八章第一回 Rangeとは – JavaScript初級者から中級者になろう – uhyohyo.net
range – Web API インターフェイス | MDN
クリック直下の単語を取得 – JavaScriptで遊ぶよ – g:javascript
WebKit なブラウザでは document.caretRangeFromPoint で collapsed range オブジェクトを取得できる。Mozilla(Firefox)では、同様な collapsed range オブジェクトを、イベントのプロパティ(e.rangeParent, e.rangeOffset)から取得できます。
当初どうにもこの range オブジェクト(今回扱うのは collapsed range オブジェクト)のイメージが掴みにくかったので、以下に range オブジェクトのプロパティを視覚化するツールを作成しました。適当な箇所をクリックすると、range オブジェクトのプロパティ名(関数オブジェクト以外)とその値を表示します。クリックイベントで collapsed range オブジェクトを取得しているので、startOffset と endOffset の値は常に同一で、collapsed プロパティの値は常に true となります。
— 動作確認 —
Firefox 34.0
Google Chrome 39.0
Firefox と Google Chrome でしか動作確認をしていません。他のブラウザでは動かないかもしれないので、ご了承ください。
collapsed range オブジェクトの可視化ツール
以下適当にクリック!range オブジェクトを dump します。
cell 1 | cell 2 | cell 3 |
cell 4 | cell 5 | cell 6 |
cell 7 | cell 8 | cell 9 |
HTML コード
以降は、上記ツールのソースコードです。HTML部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<div id="range_header">header - <b>'here is a header area.'</b></div> <div id="range_main">main - <b>'here is a main area.'</b></div> <div id="range_sub">sub - <b>'here is a sub area.'</b></div> <div id="range_footer">footer - <b>'here is a footer area.'</b></div> <br /> <table border="1"> <tr> <td>cell 1</td> <td>cell 2</td> <td>cell 3</td> </tr> <tr> <td>cell 4</td> <td>cell 5</td> <td>cell 6</td> </tr> <tr> <td>cell 7</td> <td>cell 8</td> <td>cell 9</td> </tr> </table> <br /> <div id="range_dump"></div> |
JavaScript コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
window.onclick = dump_range; function dump_range(e) { var range; // WebKit if (document.caretRangeFromPoint) { range = document.caretRangeFromPoint(e.clientX, e.clientY); // Mozilla } else if (e.rangeParent) { range = document.createRange(); range.setStart(e.rangeParent, e.rangeOffset); } var html = "--- click event dump ---<br />"; html += "X座標: " + e.clientX + "<br />"; html += "Y座標: " + e.clientY + "<br />"; html += "--- range object dump ---<br />"; for(var key in range) { if (typeof range[key] === "function") { continue; } html += key + ": " + range[key] + "<br />"; if (key === "startContainer" || key === "endContainer" || key === "commonAncestorContainer") { html += " data: " + range[key].data + "<br />"; } } var dump = document.getElementById("range_dump"); dump.innerHTML = html; } |
このツールで確認したら、startOffset, endOffset は各々 range オブジェクト内での相対的な位置を表すのだな〜とか、オフセットの位置はコンテナ(startContainer)内の最初の位置から数えるのだな〜などをよく理解できました。
- 開発記録 の関連記事
- Mastodon(マストドン)をブログ風に保存するサービスを作った
- Wunderlistからリマインダー(iPhone/iCloud)への移行ツールを作りました!
- 指定の曜日から日付を取得するツール(JavaScript)
- 書評や商品レビューのブログ記事のみにGoogle検索を絞り込むブックマークレット
- サクサクひける!ポップアップ辞書Chrome拡張(英和/英英辞典)を公開しました
- JavaScriptで英単語の原形を取得できるライブラリを公開しました
- ImagictでBingoされた英単語をつぶやくTwitter botを作成しました
- jQuery(JavaScript)でマウス座標やウィンドウサイズを取得して確認するツール
- SimString を用いたスペルミス訂正機能
- Imagict 開発日誌のブログを始めました
Leave Your Message!