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タグの直下に入っている
この辺を見かけたら怪しんだほうが良いかなと思います。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などをインストールするときはソースを眺めて「不吉な匂い」をチェックしておくべきです。