Table of Contents
基本を理解する
JavaScript と Web ストレージ API でブックマーク マネージャーをビルドするのは、基本のフロントエンドの概念をマスターするための優れたプロジェクトです。そのコアでは、アプリケーションは 3 つの主要な操作を処理する必要があります。create]、]read[[、 []]]] - 古典的な CRUD パターン、今のマイナスの更新。データがブラウザーの を [FLT:[FLT:]] に渡します。[FLT:[FLT:] サーバをオンにするには、 [FLT] テキストを[FLT:[FLT:[F] テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト
単一行のコードを書く前に、次の柱の理解を固着させます。
- [] DOM API:]]] 要素をクエリし、イベントをリスニングし、ドキュメントツリーを操作して、ブックマークを動的に表示します。
- [localStorage:]]]] ブラウザが閉じた後に、このキー値ストアはデータを保持します。 文字列のみをサポートしているため、オブジェクトはでシリアライズされ、[でdeserializedしなければなりません。
- []イベント主導プログラミング:[]フォームがイベントを放出し、ボタンの消火]イベントを削除します。 []]をマスターすることは、非交渉可能です。
- []Arrayメソッド:] []、[]]、]]]は、ブックマークリストを効率的にレンダリングし、操作するのに役立ちます。
コアブックマークマネージャの構築
HTML 構造
最小限の、意味のあるHTMLスケルトンで始まります。このフォームはブックマークの名前とURLを収集します。無秩序なリストは保存されたブックマークをレンダリングします。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bookmark Manager</title>
</head>
<body>
<h1>My Bookmarks</h1>
<form id="bookmarkForm">
<label for="name">Name</label>
<input type="text" id="name" required />
<label for="url">URL</label>
<input type="url" id="url" required />
<button type="submit">Add Bookmark</button>
</form>
<ul id="bookmarkList"></ul>
<script src="app.js" defer></script>
</body>
</html>
スクリプトタグの属性に注意してください。これにより、スクリプトが実行される前に DOM が完全に解析され、近代的な設定で のラッパーの必要性を排除します。
使いやすさのためのスタイリング(オプションが推奨)
CSS はフォーカスではなく、クリーンなインターフェイスはユーザーエクスペリエンスを向上させます。フォームをスペースアウトするためにシンプルなスタイルシートを追加し、ボタンを一貫した外観にし、ホバー効果のあるブックマークリスト項目をスタイル化します。最小インラインスタイリングは JavaScript 経由で注入することもできますが、別々のはメンテナンス性を優先します。
<!-- inside <head> -->
<link rel="stylesheet" href="style.css" />
[] では、フォームレイアウト、コンテナの最大幅、および削除ボタンの異なる視覚フィードバックを使用して、誤ってクリックを防止します。
JavaScriptロジック - アプリケーションの中心
に生きるすべての持続性と相互作用性。次のセクションは、各機能を破壊します。
データ初期化
ブックマークの現在のリストを保持する中央変数が必要です。[から初期化するか、空の配列に戻ります。
let bookmarks = [];
function loadBookmarks() {
const stored = localStorage.getItem('bookmarks');
if (stored) {
bookmarks = JSON.parse(stored);
} else {
bookmarks = [];
}
}
function saveBookmarks() {
localStorage.setItem('bookmarks', JSON.stringify(bookmarks));
}
loadBookmarks();
関数は配列の変更を毎回呼び出されます。 ブックマークの追加、編集、削除後。 これにより、ストレージはメモリ内の配列と同期されるようにします。
ブックマークの表示
ブックマークリストをレンダリングすると、 ] 配列を繰り返して、アンカータグと削除ボタンでリスト項目を作成できます。
function renderBookmarks() {
const list = document.getElementById('bookmarkList');
list.innerHTML = ''; // clear existing entries
bookmarks.forEach(function(bookmark, index) {
const li = document.createElement('li');
li.dataset.index = index;
const link = document.createElement('a');
link.href = bookmark.url;
link.textContent = bookmark.name;
link.target = '_blank';
link.rel = 'noopener noreferrer';
const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Delete';
deleteBtn.addEventListener('click', function() {
deleteBookmark(index);
});
li.appendChild(link);
li.appendChild(deleteBtn);
list.appendChild(li);
});
}
ブックマーク名にHTMLが含まれているときに、内部HTMLの代わりに[を使うと、XSS脆弱性を回避します。削除ボタンは、ブックマークのインデックスをキャプチャするために、クロージャを使用します。
ブックマークを追加する
フォームの[イベントを聞いて、デフォルトのページリロードを防ぎ、ブックマークオブジェクトを作成して配列、永続、および再レンダリングにプッシュします。
document.getElementById('bookmarkForm').addEventListener('submit', function(e) {
e.preventDefault();
const nameInput = document.getElementById('name');
const urlInput = document.getElementById('url');
const newBookmark = {
name: nameInput.value.trim(),
url: urlInput.value.trim()
};
// Basic validation: ensure URL starts with http/https
if (!newBookmark.url.startsWith('http://') && !newBookmark.url.startsWith('https://')) {
newBookmark.url = 'https://' + newBookmark.url;
}
bookmarks.push(newBookmark);
saveBookmarks();
renderBookmarks();
// Reset form
nameInput.value = '';
urlInput.value = '';
nameInput.focus();
});
この方法は簡単です。 制作のために、 コンストラクタまたは正規表現を使用して、URLフォーマットをさらに検証する必要があります。
ブックマークの削除
削除は、指定したインデックスと更新ストレージと DOM でアイテムを削除します。
function deleteBookmark(index) {
bookmarks.splice(index, 1);
saveBookmarks();
renderBookmarks();
}
[ は配列を所定の位置にミュートします。 不変性を好む場合は、] を 再割り当て ] を使用できますが、このような小さなプロジェクトでは、 [] は明確で実行可能です。
アプリケーションの充実
基本CRUDが機能したら、これらの改良をしっかりしたツールに変える。
ブックマークの編集
静的名/リンクをインライン編集モードに置き換えます。 ユーザーが編集ボタンをクリックすると、アンカータグを現在の値で入力フィールドにあらかじめ入力します。 保存時に、配列とパーシストを更新します。
実装のヒント:編集可能な入力を作成する[関数を追加します。 複数のリスナーを添付せずに編集を保存を処理するためにリストの[[]event delegation[]を使用します。
タグで分類
各ブックマークオブジェクト()にオプションのプロパティを追加します。 次に、タグが一致しないリストアイテムを非表示にするフィルタ入力でUIを拡張します。 フォーム内のコンマ区切り文字列としてタグを保存し、配列に分割することができます。
輸出入・輸出入
ユーザーはブックマークをバックアップまたは転送することができます。 またはファイルのダウンロードを使用します。 エクスポートシリアライズ ]を JSON 文字列にエクスポートし、]] および [] を介してダウンロードをトリガーします。 インポートは、JSON を読み、既存のブックマークと合併します。
function exportBookmarks() {
const data = JSON.stringify(bookmarks, null, 2);
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'bookmarks.json';
a.click();
URL.revokeObjectURL(url);
}
サーチとフィルタ
ブックマークリストの上の入力を追加します。各[]イベントで、名前(またはURL)で[配列をフィルタリングし、マッチのみを表示する[の variantを呼び出します。元のリストを失うことを避けるために、フィルタされたコピーを保存するか、計算されたパラメータを使用します。
試験とブラウザの互換性
localStorage は、すべての近代的なブラウザーでサポートされていますが、古いバージョンの Internet Explorer (IE 8 +) は異なる API を持っています。 従来の環境をサポートする必要がある場合は、多重でテストするか、Cookie に戻ってフォールバックする必要があります。 今日の []クローム、Firefox、Safari、Edge (両方のクロムとレガシー) は、問題なく および [] を処理します。
試験するときは、確認します:
- データは、ページが更新され、ブラウザが再起動します。
- UIとストレージの両方のブックマークの更新を削除します。
- ブックマーク名(引用符、アンパサンド)の特殊文字を正しくレンダリングします。
- を使わずに URL を正規化します。
[]デベロッパーツール]>アプリケーション>ストレージ>ローカルストレージは、保存されたデータを手動で検査します。
自動化テストのために、Cypress[[]]または[]]をシミュレートして、ユーザーのワークフローを入力、追加、削除、再読み込み、リストごとにアサートします。
コンテンツ
このプロジェクトでは、バニラ JavaScript のいくつかのダース線が完全に機能し、永続的な Web アプリケーションを作成することができる方法を示します。 効率的な UI の更新のための のローカルストレージ API] を、データ永続性、 のエベント委任] を、 ] をバックエンドなしに使用するために学習しました。 初期設定や、DREM のフレームワークは、DREM の初期設定や、DORM の機能を実装します。
理解を深めるために、 ]] をローカルStorage[ のMDNドキュメントを調べ、 ] に関する詳細情報を読んで、 DOM で処理します。 より高度な状態管理については、] を参照してください。 より大きなデータセットまたは サービス ワーカー オフラインで サブドメイン を拡張できます。 これらは、これらの機能を完全に拡張できます。 これらは、これらの機能を完全に作成する ベース 設定 または、 設定された または [FLT:] ベース ベース を ベース に拡張します。