●window.locationとは?
JavaScriptを学び始めたばかりの皆さん、こんにちは。
今日は、Webページの URL 情報を取得したり操作したりするために欠かせない「window.location」について解説します。
将来フロントエンドエンジニアを目指す皆さんにとって、window.location を使いこなすスキルは必須です。
window.location は、ブラウザのアドレスバーに表示されている現在のページの URL 情報を扱うための JavaScript のオブジェクトです。
このオブジェクトを通じて、URL のさまざまな構成要素(プロトコル、ホスト名、パス、クエリ文字列など)にアクセスできます。
また、新しい URL にページを遷移させたり、現在のページを再読み込みしたりするためにも使用されます。
○window.locationの基本的な構造
window.location オブジェクトには、URL を構成するさまざまなプロパティが用意されています。
それぞれのプロパティにアクセスすることで、URL の特定の部分を取得したり設定したりできます。
例えば、次のような URL があるとします。
この URL に対して、window.location オブジェクトの主なプロパティは次のような値を持ちます。
window.location.protocol
-> “https:”window.location.host
-> “www.example.com”window.location.pathname
-> “/path/to/page.html”window.location.search
-> “?id=123”window.location.hash
-> “#section1”
○window.locationのプロパティ一覧
window.location オブジェクトには、URL 情報を扱うためのさまざまなプロパティが用意されています。
ここでは、主要なプロパティの一覧を紹介します。
href
-> 完全な URL を取得または設定します。protocol
-> URL のプロトコル部分(”http:”、”https:”など)を取得または設定します。host
-> URL のホスト名とポート番号(指定されている場合)を取得または設定します。hostname
-> URL のホスト名を取得または設定します。port
-> URL のポート番号を取得または設定します。pathname
-> URL のパス部分を取得または設定します。search
-> URL のクエリ文字列(”?”以降の部分)を取得または設定します。hash
-> URL のフラグメント識別子(”#”以降の部分)を取得または設定します。origin
-> URL のオリジン(プロトコル、ホスト名、ポート番号)を取得します(読み取り専用)。
これらのプロパティを使い分けることで、URL のさまざまな構成要素にアクセスし、必要に応じて変更を加えることができます。
●URLパラメータの取得と活用
さて、フロントエンドエンジニアを目指す皆さん、ここからはいよいよwindow.locationの実践的な使い方について学んでいきましょう。
まずは、URLパラメータの取得と活用方法から始めましょう。
URLパラメータとは、URLの末尾に「?」に続けて付加される情報のことです。
このパラメータを利用することで、Webページに追加情報を渡したり、ページの状態を保持したりできます。
例えば、検索結果のページングや、フォームの入力内容を次のページに引き継ぐといった場面で大活躍です。
○サンプルコード1:URLパラメータの取得
それでは、URLパラメータを取得する方法を見ていきましょう。
window.locationオブジェクトのsearch
プロパティを使うことで、現在のURLに含まれるパラメータ文字列を取得できます。
上記のコードでは、URLSearchParams
オブジェクトを使ってパラメータ文字列を解析し、get()
メソッドで特定のパラメータ値を取得しています。
例えば、現在のURLがhttps://example.com/?key=value
だった場合、value
変数には"value"
が格納されます。
○サンプルコード2:複数のURLパラメータの取得
URLには複数のパラメータを含めることもできます。
その場合は、&
で区切って記述します。
複数のパラメータを取得するには、次のようなコードを使います。
例えば、現在のURLがhttps://example.com/?key1=value1&key2=value2
だった場合、key1
変数には"value1"
が、key2
変数には"value2"
がそれぞれ格納されます。
○サンプルコード3:URLパラメータを使った条件分岐
取得したURLパラメータを使って、ページの動作を切り替えることもできます。
次のコードは、URLパラメータの値に応じて異なるメッセージを表示する例です。
このコードでは、URLパラメータmode
の値が"dark"
であれば、ページの背景色を黒に、文字色を白に変更しています。
それ以外の場合は、通常の白背景・黒文字で表示されます。
●ページ遷移の制御
フロントエンドエンジニアを目指す皆さん、ここからはwindow.locationを使ったページ遷移の制御方法について理解していきましょう。
ページ遷移は、ユーザーのアクションに応じてWebサイトの画面を切り替える重要な機能です。
window.locationオブジェクトを活用することで、JavaScriptからページ遷移を自在に操ることができます。
○サンプルコード4:別のページへの遷移
まずは、JavaScriptを使って別のページへ遷移する方法から見ていきましょう。
window.locationオブジェクトのhref
プロパティに新しいURLを代入するだけで、ページを遷移させることができます。
上記のコードを実行すると、ブラウザは即座にhttps://example.com/new-page.html
へ遷移します。
これは、リンクをクリックしたときと同じ動作ですね。
ページ遷移のタイミングを制御したい場合に便利な方法です。
○サンプルコード5:現在のページのリロード
次に、現在のページを再読み込み(リロード)する方法を見てみましょう。
ページのリロードは、ユーザーがブラウザの更新ボタンをクリックしたときと同じ動作です。
JavaScriptからリロードするには、location.reload()
メソッドを使います。
このコードを実行すると、現在のページが再読み込みされます。
フォームの送信後や、ページの表示内容を最新の状態に更新したい場合に活用できます。
○サンプルコード6:ページ遷移前の確認ダイアログ
ページ遷移する前に、ユーザーに確認のダイアログを表示したい場合もあるでしょう。
例えば、フォームの入力内容が未保存の状態でページを離れようとしたときに、「変更内容が失われますが、よろしいですか?」といった確認メッセージを出すことで、うっかりデータを失うのを防げます。
上記のコードでは、window.onbeforeunload
イベントを使って、ページを離れる直前に確認ダイアログを表示しています。
ユーザーが「キャンセル」をクリックすると、ページ遷移はキャンセルされます。
●よくあるエラーと対処法
さて、フロントエンドエンジニアを目指す皆さん、ここまでwindow.locationの基本的な使い方やページ遷移の制御方法について学んできましたが、実際にコードを書いていると、思わぬエラーに遭遇することがあるでしょう。
エラーメッセージに戸惑ってしまい、なかなか先に進めないなんてことも。
ここでは、window.locationを使う際によく出くわすエラーとその対処法を3つ紹介します。
エラーに悩まされるのは、あなただけではありません。一緒に乗り越えていきましょう!
○TypeError: Cannot read property ‘location’ of undefined
まずは、”TypeError: Cannot read property ‘location’ of undefined”というエラーから見ていきましょう。
このエラーは、window
オブジェクトがundefined
になっている場合に発生します。
つまり、window.location
にアクセスしようとしたけれど、window
オブジェクトが存在しないために起こるのです。
このエラーが起きる主な原因は、ブラウザ以外の環境(例えば、Node.jsなど)でコードを実行しようとしたときです。
window
オブジェクトはブラウザ特有のオブジェクトなので、ブラウザ以外の環境では存在しません。
対処法としては、コードがブラウザ環境で実行されているかどうかを確認してから、window.location
にアクセスするようにしましょう。
上記のように、typeof window !== 'undefined'
でwindow
オブジェクトの存在をチェックすれば、エラーを回避できます。
○SecurityError: The operation is insecure
次は、”SecurityError: The operation is insecure”というエラーについて見てみましょう。
このエラーは、安全ではない操作を行おうとしたときに発生します。
具体的には、HTTPSで提供されているページから、HTTPのURLへ遷移しようとした場合などに起こります。
ブラウザのセキュリティ機能が、安全ではない遷移を防いでいるのです。
HTTPSからHTTPへの遷移は、機密情報が平文で送信される可能性があるため、セキュリティ上のリスクがあります。
対処法は、遷移先のURLをHTTPSに変更することです。
つまり、安全な通信が可能なHTTPSのURLを使うようにしましょう。
HTTPSを使えない場合は、遷移先のページをHTTPS対応にするか、別の方法を検討する必要があります。
○SyntaxError: Unexpected token ‘=’
最後は、”SyntaxError: Unexpected token ‘='”というエラーを取り上げます。
このエラーは、JavaScriptの構文に誤りがあるときに発生します。
window.location
に関連して起きるケースとしては、URLパラメータの設定を誤ったときなどが考えられます。
例えば、次のようなコードは構文エラーになります。
上記のコードでは、URLパラメータを ?key=value
のように指定していますが、これは正しい構文ではありません。
URLパラメータを設定するには、?
の後にキーと値をイコール (=
) でつなぎ、複数のパラメータがある場合は &
で区切る必要があります。
正しくは、次のように書きます。
構文エラーを避けるためには、コードを書くときに構文の正しさに気をつけることが大切です。
エディタの構文チェック機能を活用したり、コードをこまめに動作確認したりして、エラーを早期に発見・修正するようにしましょう。
エラーは誰にでも起こり得るものですが、エラーメッセージをヒントに原因を特定し、適切な対処法を見つけることができれば、難関を乗り越えられます。
自分だけで解決できないときは、先輩エンジニアに相談したり、オンラインのフォーラムで質問したりするのも良いでしょう。
エラーと向き合う経験を積むことで、より強いエンジニアへと成長していけるはずです。
●window.locationの応用例
フロントエンドエンジニアを目指す皆さん、ここまでwindow.locationの基本的な使い方から、エラーの対処法までを解説してきました。
もう、window.locationを使いこなせる自信が少しずつ湧いてきたのではないでしょうか。
ここからは、window.locationを使った便利な機能の実装例を2つ紹介します。
実際のプロジェクトでも活用できる、実践的なコード例ばかりですよ。
一緒に手を動かしながら、window.locationの応用力を身につけていきましょう!
○サンプルコード7:現在のURLをコピーするボタンの実装
まずは、現在のページのURLをクリップボードにコピーする機能の実装方法から見ていきましょう。
シェアボタンなどで活用できる、ユーザーにとって便利な機能です。
上記のコードでは、window.location.href
で現在のURLを取得し、navigator.clipboard.writeText()
メソッドを使ってクリップボードにコピーしています。
コピーの成功・失敗に応じて、アラートでメッセージを表示するようにしています。
このコードを実行するボタンを設置すれば、ワンクリックでURLのコピーが完了します。
ユーザーがURLを共有したいときに、簡単に行えるようになりますね。
○サンプルコード8:ページ内のアンカーリンクのスムーズスクロール
次は、ページ内のアンカーリンクをクリックしたときに、スムーズにスクロールする機能を実装してみましょう。
長いページでも、目的の位置にすっと移動できるので、ユーザーエクスペリエンスの向上につながります。
このコードでは、smoothScroll()
関数でアンカーリンクの目的地までスムーズにスクロールするようにしています。
window.scrollTo()
メソッドのbehavior
オプションに'smooth'
を指定することで、なめらかなスクロールを実現しています。
また、querySelectorAll()
メソッドで、href
属性が#
で始まるすべてのリンクを取得し、クリックイベントを監視しています。
リンクがクリックされたら、デフォルトの動作をキャンセルし、smoothScroll()
関数を呼び出すようにしています。
アンカーリンクを設置するには、次のようなHTMLを記述します。
href
属性で指定したIDを持つ要素まで、スムーズにスクロールしてくれます。
まとめ
これからは、今回学んだ知識と経験を糧に、自分のプロジェクトでwindow.locationを活用していってください。
きっと、ユーザーにとってより使いやすく、インタラクティブなWebサイトを作れるようになるはずです。
困難に直面したときは、ここで得た知見を思い出し、乗り越えていきましょう。