- なぜ昔のJavaScriptはブラウザごとに動かなかったのか
- DOMという最大の不一致
- CSS操作も統一されていなかった
- Ajaxの互換性問題
- ここで登場したjQueryの役割
- jQueryは「機能」ではなく「翻訳層」
- なぜ急速に普及したのか
- 注意点 ― jQueryが必要なくなった理由
- まとめ
なぜ昔のJavaScriptはブラウザごとに動かなかったのか
かつてのWeb開発では「JavaScriptを書けば動く」という前提がありませんでした。
同じコードを書いても、Chromeでは動き、Internet Explorerでは壊れ、Firefoxでは挙動が違う、ということが日常的に起きていました。
これはJavaScriptの仕様が未成熟だったからではありません。
問題の本質は“ブラウザがJavaScriptをどう実装していたか”にあります。
現在の私たちはECMAScriptという共通仕様の上で開発しています。しかし2000年代前半、ブラウザ各社は互換性よりも自社機能を優先していました。
つまり「同じ言語を使っているが、別の実行環境」だったのです。
この状況を理解すると、jQueryの役割が単なるライブラリではなかった理由が見えてきます。
DOMという最大の不一致
DOMは共通規格だったが共通実装ではなかった
WebページはHTMLで構造を持ちます。
JavaScriptはその構造、つまりDOM(Document Object Model)を操作します。
理屈の上では、DOMはW3Cが定めた共通規格です。
しかし問題は「仕様」と「実装」は別物だったことです。
たとえば要素の取得です。
document.getElementById("title");
現在では当然動きます。
しかし当時のInternet Explorerでは次のコードも存在しました。
document.all["title"];
IEは独自DOMを持っていたため、開発者は両方に対応する必要がありました。
var el; if (document.getElementById) { el = document.getElementById("title"); } else if (document.all) { el = document.all["title"]; }
つまりJavaScriptを書くというより、
ブラウザ判定コードを書く作業が大半だったのです。
イベントモデルの違い
イベント処理はさらに深刻でした。
同じクリックイベントでも登録方法が違います。
element.addEventListener("click", handler, false); // 標準 element.attachEvent("onclick", handler); // IE
引数の順番、イベントオブジェクト、thisの参照先まで異なります。
同じイベント処理でも2種類のコードを書く必要がありました。
しかもイベントバブリングの挙動も違います。
フォーム送信、リンククリック、キーボード入力など、UIの基本操作すべてに影響しました。
CSS操作も統一されていなかった
スタイル変更ですら共通ではありません。
element.style.opacity = "0.5"; // 標準 element.style.filter = "alpha(opacity=50)"; // IE
透明度ひとつ変えるだけで分岐が必要でした。
さらにボックスモデルの解釈も異なり、要素サイズの計算結果が変わる問題もありました。
つまり当時のフロントエンド開発は「レイアウト調整」ではなく
ブラウザの癖を相手にする作業でした。
Ajaxの互換性問題
特に大きかったのがAjaxです。
非同期通信はWebアプリの基盤ですが、これも統一されていませんでした。
var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
さらに、
- readyStateの監視
- ステータスコード判定
- 例外処理
を自前で書く必要がありました。
開発者はビジネスロジックではなく、通信の互換性に時間を費やしていました。
ここで登場したjQueryの役割
jQueryは新しいAPIを作ったわけではありません。
既存APIの差異を1つの書き方に統一しました。
要素取得はこうなります。
$("#title");
イベント登録はこうです。
$("#btn").click(handler);
Ajax通信も同様です。
$.ajax({ url: "/api", success: function(data){ console.log(data); } });
開発者はブラウザ判定を書かなくてよくなりました。
これがjQueryの本質です。
jQueryは「機能」ではなく「翻訳層」
重要なのは、jQueryが特別な機能を提供したわけではない点です。
DOM、イベント、Ajaxはもともとブラウザに存在していました。
jQueryがしたことは、
ブラウザごとのAPIを共通言語に翻訳したことです。
いわばOSのドライバのような存在です。
ハードウェア差を隠すことで、開発者はアプリケーションに集中できるようになりました。
なぜ急速に普及したのか
普及の理由はシンプルです。
- コード量が激減した
- デバッグ時間が減った
- IE対応が容易になった
特に企業サイトではInternet Explorer対応が必須でした。
jQueryは互換性対策コストを大幅に下げました。
ライブラリの導入というより、
品質保証の手段として採用されたのです。
注意点 ― jQueryが必要なくなった理由
現在では次が普通に使えます。
document.querySelector("#title"); fetch("/api"); element.addEventListener("click", handler);
つまりブラウザ自体が互換性を持ちました。
jQueryが解決していた問題が、標準仕様として解決されたのです。
そのため「jQueryは不要」と言われるようになりましたが、正確には
役目を終えたと言う方が近いでしょう。
まとめ
昔のJavaScriptがブラウザごとに動かなかった理由は、言語仕様ではなくブラウザ実装の分裂でした。
jQueryは
- DOM差異の吸収
- イベントモデルの統一
- Ajaxの簡略化
を実現し、Web開発を初めて安定させました。
現在のフロントエンド開発が「当たり前に動く」のは、
過去に互換性問題と戦ったライブラリが存在したからです。
jQueryは過去の技術ではなく、
現代Web標準の前段階だった技術と考えると理解しやすいかもしれません。