JavaScript連載第6回

これでできる! クロスブラウザJavaScript入門の第6回はJavaScriptとHTMLとDOMの基本#1です。
今回は正直に言ってかなり苦戦しました。。DOM周りは書くことがありすぎてなかなかまとめきれないし、その前にHTMLについて書いておきたいこともあってと。
script要素といえば、昔はlanguage属性というのがあって…とかは今更書くことでもないかなとか。でも、language属性書いているHTMLって結構見かけるんですよね…。まあ、あっても何か問題が起こるわけではないし、language属性とかが書いてあったらそこからいわゆる「不吉な匂い」を嗅ぎ取ることができるので、ある意味では有用です。
「不吉な匂い」を醸しだすパーツを独断と偏見で挙げてみると、

  • language属性
  • (不必要な)eval
  • document.all(最近ではクローキングされているとはいえ、条件分岐に使うのも微妙です。)
    • 次点で document.foo (fooはname属性に対応)
  • setTimeout、setIntervalの第一引数に関数オブジェクトではなく、文字列を渡している(via id:mattn)
  • HTMLで、formタグがtableタグの直下に入っている
    • formタグのデフォルトスタイルのマージンを消す、CSS以前のいにしえのてくにっく。ECサイトとかで未だに現役だったりする。

この辺を見かけたら怪しんだほうが良いかなと思います。evalは判断が微妙だけど。
ちょうど昨日見かけたコードで、こんなのが。

    script.innerText += 'for (x in navigator) {';
    script.innerText += 'eval("new_nav." + x + " = navigator." + x + ";");';
    script.innerText += '}';

他にも突っ込みどころいっぱいなんですが、少なくとも

    script.innerText += 'for (x in navigator) {';
    script.innerText += '  new_nav[x] = navigator[x];';
    script.innerText += '}';

とするべきでしょう。
特に、Greasemokeyなどをインストールするときはソースを眺めて「不吉な匂い」をチェックしておくべきです。