ページ遷移をJavaScriptで!location.hrefの使い方ガイド

JavaScriptのlocation.hrefを使ったページ遷移について初心者向けに完全解説。基本的な使い方から実践的な活用例まで詳しく説明します。

Learning Next 運営
28 分で読めます

ページ遷移をJavaScriptで!location.hrefの使い方ガイド

JavaScriptでページを別のページに移動させたいと思ったことはありませんか?

「ボタンをクリックしたら別のページに移動させたい」 「location.hrefって何?どうやって使うの?」

そんな疑問を抱いている方は多いと思います。 でも大丈夫です!

この記事では、JavaScriptのlocation.hrefを使ったページ遷移について初心者向けに詳しく解説します。 基本的な使い方から実践的な活用例まで、Webサイトのナビゲーション機能をマスターしましょう。

きっと「こんなに簡単だったんだ!」と感じられるはずですよ。

location.hrefって何?基本を理解しよう

location.hrefの役割

location.hrefは、現在のページのURLを取得・設定できるJavaScriptのプロパティです。

簡単に言うと、「今いるページのアドレスを確認したり、別のページに移動したりする」機能です。 Webサイトのページ間移動やリダイレクト処理など、様々な場面で活用できます。

イメージとしては、ナビゲーションの指示を出すコントローラーのような存在ですね。

locationオブジェクトの概要

locationオブジェクトは、現在のページのURL情報を管理するブラウザの標準オブジェクトです。

// 現在のページのURL全体を取得
console.log(location.href);
// 実行結果: "https://example.com/page.html?param=value#section"
// locationオブジェクトの主要プロパティ
console.log(location.protocol); // "https:"
console.log(location.hostname); // "example.com"
console.log(location.pathname); // "/page.html"
console.log(location.search); // "?param=value"
console.log(location.hash); // "#section"

この例では、URLの各部分を取得しています。 location.href でURL全体、他のプロパティで個別の部分を取得できます。

この中でも href プロパティが最も使用頻度が高く、ページ遷移の基本となります。

基本的な使い方をマスターしよう

現在のURLの取得

location.hrefを使って現在のページのURLを取得する方法です。

// 現在のページのURLを取得
let currentUrl = location.href;
console.log('現在のURL:', currentUrl);
// URLの情報を表示する関数
function showCurrentPageInfo() {
console.log('完全なURL:', location.href);
console.log('ドメイン:', location.hostname);
console.log('パス:', location.pathname);
console.log('検索パラメータ:', location.search);
}
showCurrentPageInfo();

この関数では、現在のページの詳細な情報を取得しています。 デバッグや分析の際に役立つ基本的なテクニックです。

URLの構造を理解することで、より高度な処理ができるようになりますね。

基本的なページ遷移

location.hrefに新しいURLを設定してページを移動する方法です。

// 絶対URLでページ遷移
location.href = 'https://example.com/new-page.html';
// 相対URLでページ遷移
location.href = 'about.html';
// 同じサイト内の別ディレクトリ
location.href = '/contact/form.html';
// 外部サイトへの遷移
location.href = 'https://google.com';

用途に応じて適切なURL形式を選ぶことが重要です。 相対URLは同じサイト内、絶対URLは外部サイトや明確な指定が必要な場合に使います。

ボタンクリックでのページ遷移

実際のWebページでボタンクリック時にページを移動する例です。

// ボタンクリックで遷移する基本的な例
function setupNavigationButtons() {
let homeButton = document.getElementById('homeButton');
let contactButton = document.getElementById('contactButton');
if (homeButton) {
homeButton.addEventListener('click', function() {
location.href = '/';
});
}
if (contactButton) {
contactButton.addEventListener('click', function() {
location.href = '/contact.html';
});
}
}
// ページ読み込み後に実行
document.addEventListener('DOMContentLoaded', setupNavigationButtons);

この例では、HTMLの button 要素にクリックイベントを設定しています。 要素の存在チェックを行うことで、エラーを防いでいます。

ユーザーの操作に応じて適切なページに誘導できますね。

実践的な活用例で理解を深めよう

条件付きページ遷移

特定の条件を満たした場合のみページ遷移を行う例です。

// ログイン処理後の遷移を管理する関数
function redirectAfterLogin(username, password) {
// ログイン処理(簡易版)
if (validateCredentials(username, password)) {
alert('ログイン成功!');
// 遷移先を決定
let redirectUrl = getRedirectUrl(username);
// 少し遅延してからページ遷移
setTimeout(() => {
location.href = redirectUrl;
}, 1000);
} else {
alert('ログインに失敗しました');
// ログインページにリダイレクト
location.href = '/login.html';
}
}
function validateCredentials(username, password) {
// 実際のアプリでは適切な認証処理を実装
return username && password && password.length >= 6;
}
function getRedirectUrl(username) {
// ユーザーの種類に応じて遷移先を変更
if (username.includes('admin')) {
return '/admin/dashboard.html';
} else {
return '/user/profile.html';
}
}

この例では、ログイン結果に応じて遷移先を変えています。 ユーザーの権限に応じて適切なページに誘導する実用的なパターンです。

setTimeout を使うことで、ユーザーにメッセージを確認する時間を与えています。

URLパラメータを保持した遷移

現在のページのパラメータを次のページに引き継ぐ例です。

// パラメータを保持してページ遷移する関数
function navigateWithParams(targetPage) {
// 現在のURLパラメータを取得
let currentParams = new URLSearchParams(location.search);
// 新しいページのURLを構築
let newUrl = targetPage;
// パラメータが存在する場合は追加
if (currentParams.toString()) {
newUrl += '?' + currentParams.toString();
}
location.href = newUrl;
}
// 商品一覧から商品詳細への遷移例
function setupProductNavigation() {
let productLinks = document.querySelectorAll('.product-link');
productLinks.forEach(link => {
link.addEventListener('click', function(event) {
event.preventDefault();
let productId = this.dataset.productId;
let detailPage = `/product/detail.html?id=${productId}`;
// 現在のフィルタ条件も保持
let currentParams = new URLSearchParams(location.search);
currentParams.append('id', productId);
location.href = `/product/detail.html?${currentParams.toString()}`;
});
});
}

この関数では、URLSearchAPIを使ってパラメータを操作しています。 フィルタ条件や検索キーワードを保持したまま、詳細ページに遷移できます。

ECサイトなどでユーザーの検索状態を維持する際に便利ですね。

ショッピングカートからチェックアウト

ECサイトでのページ遷移の実装例を見てみましょう。

// ショッピングカートのナビゲーション管理
class ShoppingCartNavigation {
constructor() {
this.setupEventListeners();
}
setupEventListeners() {
// カートに追加ボタン
let addToCartButtons = document.querySelectorAll('.add-to-cart');
addToCartButtons.forEach(button => {
button.addEventListener('click', (event) => {
this.addToCart(event.target.dataset.productId);
});
});
// チェックアウトボタン
let checkoutButton = document.getElementById('checkoutButton');
if (checkoutButton) {
checkoutButton.addEventListener('click', () => {
this.proceedToCheckout();
});
}
}
addToCart(productId) {
// カート追加処理
this.updateCartCount();
// カート追加後の選択肢を表示
this.showPostAddOptions(productId);
}
showPostAddOptions(productId) {
let choice = confirm('商品をカートに追加しました。
OK: カートを見る
キャンセル: 買い物を続ける');
if (choice) {
location.href = '/cart.html';
}
// キャンセルの場合は現在のページに留まる
}
proceedToCheckout() {
// カートの内容をチェック
let cartItems = this.getCartItems();
if (cartItems.length === 0) {
alert('カートが空です');
location.href = '/products.html';
return;
}
// ログイン状態をチェック
if (!this.isLoggedIn()) {
// ログイン後に戻ってこられるようにURLを保存
localStorage.setItem('redirectAfterLogin', '/checkout.html');
location.href = '/login.html';
return;
}
// チェックアウトページに遷移
location.href = '/checkout.html';
}
getCartItems() {
// カートの内容を取得
let cartData = localStorage.getItem('cart');
return cartData ? JSON.parse(cartData) : [];
}
isLoggedIn() {
// ログイン状態をチェック
return localStorage.getItem('authToken') !== null;
}
updateCartCount() {
// カートの商品数を更新
let cartItems = this.getCartItems();
let cartCount = document.getElementById('cartCount');
if (cartCount) {
cartCount.textContent = cartItems.length;
}
}
}
// アプリケーションの初期化
document.addEventListener('DOMContentLoaded', () => {
new ShoppingCartNavigation();
});

この例では、クラス設計でショッピングカートの遷移を管理しています。 カートの状態やログイン状態をチェックして、適切なページに誘導します。

複数の条件をチェックしながら、ユーザーにとって最適な体験を提供していますね。

高度な遷移制御を身につけよう

遷移前の確認ダイアログ

ユーザーに確認を求めてからページ遷移を行う方法です。

// 安全な遷移を行う関数
function safeNavigate(url, message = 'このページを離れますか?') {
let confirmed = confirm(message);
if (confirmed) {
location.href = url;
}
return confirmed;
}
// フォーム入力中の離脱防止クラス
class FormExitPrevention {
constructor(formSelector) {
this.form = document.querySelector(formSelector);
this.hasUnsavedChanges = false;
this.setupFormMonitoring();
this.setupExitPrevention();
}
setupFormMonitoring() {
if (!this.form) return;
// フォーム要素の変更を監視
this.form.addEventListener('input', () => {
this.hasUnsavedChanges = true;
});
// フォーム送信時は警告を無効化
this.form.addEventListener('submit', () => {
this.hasUnsavedChanges = false;
});
}
setupExitPrevention() {
// ページ離脱時の警告
window.addEventListener('beforeunload', (event) => {
if (this.hasUnsavedChanges) {
event.preventDefault();
event.returnValue = ''; // Chrome対応
return ''; // 他のブラウザ対応
}
});
}
}
// 使用例
document.addEventListener('DOMContentLoaded', () => {
new FormExitPrevention('#contactForm');
});

この実装では、フォームの変更状態を監視しています。 未保存の変更がある場合は、ユーザーに離脱の確認を求めます。

データの消失を防ぐ重要な機能ですね。

段階的なページ遷移

ステップバイステップのページ遷移を実装する例です。

// ステップナビゲーション管理クラス
class StepNavigation {
constructor() {
this.currentStep = this.getCurrentStepFromUrl();
this.totalSteps = 4;
this.setupNavigation();
}
getCurrentStepFromUrl() {
let params = new URLSearchParams(location.search);
return parseInt(params.get('step')) || 1;
}
setupNavigation() {
// 次へボタン
let nextButton = document.getElementById('nextStep');
if (nextButton) {
nextButton.addEventListener('click', () => {
this.nextStep();
});
}
// 前へボタン
let prevButton = document.getElementById('prevStep');
if (prevButton) {
prevButton.addEventListener('click', () => {
this.previousStep();
});
}
}
nextStep() {
if (this.validateCurrentStep()) {
if (this.currentStep < this.totalSteps) {
this.goToStep(this.currentStep + 1);
} else {
this.completeProcess();
}
}
}
previousStep() {
if (this.currentStep > 1) {
this.goToStep(this.currentStep - 1);
}
}
goToStep(stepNumber) {
if (stepNumber < 1 || stepNumber > this.totalSteps) {
return;
}
// 進捗を保存
this.saveProgress();
// URLを更新してページ遷移
let newUrl = `${location.pathname}?step=${stepNumber}`;
location.href = newUrl;
}
validateCurrentStep() {
// 各ステップの検証ロジック
switch (this.currentStep) {
case 1:
return this.validatePersonalInfo();
case 2:
return this.validateContactInfo();
case 3:
return this.validatePaymentInfo();
default:
return true;
}
}
validatePersonalInfo() {
let name = document.getElementById('name')?.value;
let email = document.getElementById('email')?.value;
if (!name || !email) {
alert('名前とメールアドレスを入力してください');
return false;
}
return true;
}
saveProgress() {
// 現在のフォームデータを保存
let form = document.querySelector('form');
if (form) {
let formData = new FormData(form);
let data = Object.fromEntries(formData.entries());
localStorage.setItem('formProgress', JSON.stringify(data));
}
}
completeProcess() {
// 最終確認
let confirmed = confirm('入力内容を送信しますか?');
if (confirmed) {
// 完了ページに遷移
location.href = '/complete.html';
}
}
}
// アプリケーションの初期化
document.addEventListener('DOMContentLoaded', () => {
new StepNavigation();
});

この実装では、多段階フォームのナビゲーションを管理しています。 各ステップでバリデーションを行い、進捗を保存しながら進めます。

ユーザーの入力体験を向上させる高度なテクニックです。

セキュリティと注意点を理解しよう

XSS対策

悪意のあるスクリプトによるページ遷移を防ぐ方法です。

// 安全なリダイレクト関数
function safeRedirect(url) {
// URLの妥当性チェック
if (!isValidUrl(url)) {
console.error('無効なURLです:', url);
return false;
}
// 外部サイトへの遷移の場合は確認
if (isExternalUrl(url)) {
let confirmed = confirm(`外部サイト(${url})に移動します。よろしいですか?`);
if (!confirmed) {
return false;
}
}
location.href = url;
return true;
}
function isValidUrl(url) {
try {
// javascript:で始まるURLを拒否
if (url.toLowerCase().startsWith('javascript:')) {
return false;
}
// data:で始まるURLを拒否
if (url.toLowerCase().startsWith('data:')) {
return false;
}
// 相対URLまたは有効な絶対URLかチェック
new URL(url, location.origin);
return true;
} catch (e) {
return false;
}
}
function isExternalUrl(url) {
try {
let urlObj = new URL(url, location.origin);
return urlObj.hostname !== location.hostname;
} catch (e) {
return false;
}
}
// 安全なナビゲーションの設定
function setupSafeNavigation() {
let externalLinks = document.querySelectorAll('a[href^="http"]');
externalLinks.forEach(link => {
link.addEventListener('click', function(event) {
event.preventDefault();
safeRedirect(this.href);
});
});
}

この実装では、危険なURLパターンをチェックしています。 外部サイトへの遷移時は必ずユーザーに確認を求めます。

セキュリティを意識したナビゲーション設計が重要ですね。

ブラウザ互換性とフォールバック

古いブラウザでも動作する確実なページ遷移の実装です。

// 汎用的なナビゲーション関数
function universalNavigate(url) {
try {
// モダンブラウザ
if (typeof location.href === 'string') {
location.href = url;
}
// フォールバック1
else if (location.replace) {
location.replace(url);
}
// フォールバック2
else if (window.location.assign) {
window.location.assign(url);
}
// 最後の手段
else {
window.location = url;
}
} catch (error) {
// 全ての方法が失敗した場合
console.error('ページ遷移に失敗:', error);
// フォームsubmitでのフォールバック
let form = document.createElement('form');
form.method = 'GET';
form.action = url;
document.body.appendChild(form);
form.submit();
}
}
// ブラウザ機能の検出
function checkNavigationSupport() {
let support = {
locationHref: typeof location.href === 'string',
locationReplace: typeof location.replace === 'function',
locationAssign: typeof window.location.assign === 'function',
historyAPI: !!(window.history && window.history.pushState)
};
console.log('ナビゲーション機能サポート:', support);
return support;
}

この実装では、複数のフォールバック方法を用意しています。 古いブラウザでも確実にページ遷移が動作するようになります。

幅広いユーザー環境に対応する重要なテクニックです。

まとめ:location.hrefでスマートなナビゲーションを

JavaScriptのlocation.hrefについて、基本から応用まで詳しく解説しました。

重要なポイントをおさらいしましょう。

  • location.hrefは現在のページURLの取得・設定に使用
  • ボタンクリックや条件付きでのページ遷移が可能
  • URLパラメータの保持や段階的な遷移も実装可能
  • セキュリティを考慮した安全な遷移制御が重要

実践のコツも忘れずに。

  • ユーザーの状態に応じた適切な遷移先の選択
  • フォーム入力時の離脱防止機能の実装
  • 外部サイトへの遷移時の確認ダイアログ
  • ブラウザ互換性を考慮したフォールバック処理

適切にlocation.hrefを使用することで、ユーザーフレンドリーで安全なWebサイトナビゲーションを実現できます。 特に、ユーザー体験を向上させるための遷移制御とセキュリティ対策は、実際のプロジェクトでは欠かせません。

これらの基礎技術をマスターして、より使いやすいWebアプリケーションを作成してみませんか? きっと「こんなに柔軟にページ遷移を制御できるんだ!」と実感できるはずです。

関連記事