ちょっとしたメモ

ホームページ・リーダーとDOM

ひとつ恥を忍んで白状しておくと、このサイトのページは、長い間ホームページ・リーダーの利用者にとってはとんでもなく使いにくいものだった。ずいぶん以前に知人から指摘を受けて、およその見当はつけたものの、すぐに対応する時間がなく、そのまま放置状態で約1年。改めて指摘を頂いたので、詳細に状況を検討し、ようやく改善に至った。原因は、どうもスクリプトによるDOMのテキスト・ノード生成に関係ありそうだ。

問題は、ページを読み上げている途中に「内部エラー」が発生したり、一部のキーが正しく動作しなくなるというもの。ページ内目次生成スクリプトを修正することで問題は収まったが、これは一般的に発生するトラブルの可能性があるので、いくつか実験してみた。どうやら、createTextNodeで空白のテキスト・ノードを生成してDOMツリーのノードにくっつけると、この「内部エラー」が発生するように思われる。

document.getElementById('bar').appendChild(document.createTextNode(""));

これでホームページ・リーダーは、文書を少し読み上げたところで「内部エラーが起きました。」と宣言してストップしてしまう。わざわざ空白のテキスト・ノードをつくることはないと思うかも知れないが、createTextNode()の引数を変数にしているときに、その変数の中身が""になることは少なくない。

空白のテキスト・ノードをつくること自体には問題はなく、そのノードをDOMツリーに加えることで問題が生じているようだ。それは、次のようにいったん空白として生成したテキスト・ノードに、あとでデータを加えてやればエラーは起こらないことからも分かる。

(例)

var foo = document.createTextNode("");
foo.data = "xyz";
document.getElementById('bar').appendChild(foo);

テキスト・ノードを付与する親ノードによって違いがあるかどうかなど、原因を完全に調査究明できたわけではないが、スクリプトでDOMを操作する場合、少なくとも上記の点に注意しないと、ホームページ・リーダーでトラブルを生じる可能性が高いと言えるだろう。ユニバーサル・アクセスを自らの重要な課題として掲げておきながら、長期にわたって問題点を放置していたことを懺悔しつつ、読者諸賢のご参考に報告します。