ドキュメントモデルオブジェクトに各文字を配置することは、思ったほど不快ではありません。HTML解析、DOM表現、およびイベント処理は、最新のブラウザーでのメモリーと処理の点で非常に効率的です。同様のメカニズムが低レベルで使用され、文字もレンダリングされます。ブラウザがそのレベルで何をするかをシミュレートするには、多くの作業が必要です。
- ほとんどのドキュメントは可変幅の文字で構成されています
- ラッピングは、さまざまな方法で正当化または調整できます
- 文字とバイトの間に1対1のマッピングはありません
- 真に国際化された堅牢なソリューションであるためには、サロゲートペアもサポートされている必要があります1
この例は軽量で、読み込みが速く、一般的なブラウザ間で移植可能です。その優雅さはすぐにはわかりません。国際的なキャラクターとイベントリスナーの間に1対1の対応を確立することで、多くの信頼性が得られます。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Character Click Demo</title>
<script type='text/javascript'>
var pre = "<div onclick='charClick(this, ";
var inf = ")'>";
var suf = "</div>";
function charClick(el, i) {
var p = el.parentNode.id;
var s = "para '" + p + "' idx " + i + " click";
ele = document.getElementById('result');
ele.innerHTML = s; }
function initCharClick(ids) {
var el; var from; var length; var to; var cc;
var idArray = ids.split(" ");
var idQty = idArray.length;
for (var j = 0; j < idQty; ++ j) {
el = document.getElementById(idArray[j]);
from = unescape(el.innerHTML);
length = from.length;
to = "";
for (var i = 0; i < length; ++ i) {
cc = from.charAt(i);
to = to + pre + i + inf + cc + suf; }
el.innerHTML = to; } }
</script>
<style>
.characters div {
padding: 0;
margin: 0;
display: inline }
</style>
</head>
<body class='characters' onload='initCharClick("h1 p0 p2")'>
<h1 id='h1'>Character Click Demo</h1>
<p id='p0'>æ€ – ࿗Ø —</p>
<p id='p1'>Next E para.</p>
<p id='p2'>© 2017</p>
<hr>
<p id='result'> </p>
</body>
</html>
[1]この単純な例にはサロゲートペアの処理はありませんが、iループの本体に追加することができます。