クロスブラウザ対応,コードに現れる意思
ベタでブラウザ判定しているJavaScriptのコードが嫌いだ。
なんで嫌いかと言うと、「判定しているブラウザには(意地でも)対応するけど、それ以外は知らねーよ。」というスタンスの表明に見えるからだ。
そして、そういうスタンスは、間違っているとは思わないが、俺は賛成出来ない。
Web上に公開されているのに特定の環境に対してのみ開かれているいうことに対して、違和感を感じるから。
じゃあ、クロスブラウザなコードをどう実装するかと言うと、例えば、<object id="flash_obj"><embed id="flash_emb" /><noembed>....</noembed></object>というようなタグがあった場合、
functon getEmbededElementByPrefixOfId(prefix) { return (document.getElementById(prefix + '_emb')) ? document.getElementById(prefix + '_emb') : document.getElementById(prefix + '_obj'); }
というような取り方をしてみるというような、その環境でその手段を実現するために有効な実装方法を利用して行くのが良いと思っている。*1
あと、余談だけど、上のコード、idのprefixベースじゃなくって、idをobject,embedで同じものにしても、大体の環境で動くような気がする。試す気も無いし、一つのdocument上に同じidがあるのはどうしても許せないからそういうことはやらない。それ以前に、IE6だったと思うんだけど、一つのdocument上に同一のidがある場合、getElementByIdが配列を返してきやがる。それ、getElementsByPseudoIdって名前にでもしろよ。
ちなみに、更に余談の余談だけど、3年ぐらい前関わったとあるプロジェクトがIE限定でのものだったんだけど、何故か一つのdocument内に同じidが山盛りなHTMLと、IEのgetElementByIdの不思議挙動をフル活用していて、
var elems = document.getElementById('foo'); for(var i = 0; i < elems.length; i++) { bar(elems[i]); }
みたいなコード山盛りで、頭がクラクラした。
勿論、文句は言った。「動いているから良いじゃない。」と言われて、「コレって、バグとバグが重なってたまたま上手く動いているだけって状況なんですけど?」と返したんだけど、聞き入られず、間もなく俺はその会社を辞めた。
なんか、スーツな仕事はもう良いやって思い切るトドメみたいな感じだったのかな。
話ズレすぎた。
UAを見ずに、動く実装を返そうと試みることで、コードを書くときに「あなたのUAに関わらず、なるべく動くように努力します。」と強く意識出来るんじゃないのかと思う。少なくとも自分はそうだ。
あと、俺は、記憶力が良い方じゃないので、「このブラウザは、こうやったら実現出来る。あのブラウザは、ああやれば良い。」みたいなことはいちいち覚えられない。覚えられたとして、「これを実現するためには、これかそれかあれかどれか動く方法を取ればいい。」ってレベルだ。
環境と実装まで頭に入れるには、 UAの数が多すぎる。
系統にまとめるとしても、mozillaベースだとか、khtmlベースだとか、operaだとか、全然compatibleじゃないmozilla compatibleだとかね。
どう考えても、UA判定ベースのやり方より実装判定ベースの方が、分岐がシンプル。