Basics에 대한 이해

JavaScript와 Web Storage API를 사용하여 북마크 관리자를 구축하는 것은 기본 프론트 엔드 개념을 마스터하기위한 훌륭한 프로젝트입니다. 핵심에서 응용 프로그램은 3 가지 기본 작업을 처리해야합니다 : [[FLT : 0]] [[FLT : 1], [[FLT : 2]]]read[FLT : 3]], [[FLT : 4]]]delete[FLT : 5] - 지금을위한 고전적인 CRUD 패턴, 마이너스 업데이트. [FLT : 7]]에 대한 데이터가없는 세션 [FLT : 6]]에 대한 데이터가없는 세션 [FLT : 6]]에 대한 데이터가 허용됩니다. [FLT]

코드의 단일 라인을 작성하기 전에 다음 기둥의 이해를 고소하십시오.

  • DOM API: 당신은 요소, 이벤트를 듣고, 문서 트리를 조작하여 책갈피를 동적으로 표시 할 수 있습니다.
  • localStorage: 이 키값 저장소는 브라우저가 닫히는 후에도 데이터를 유지합니다. 문자열만 지원하므로, 객체는 ]로 직렬화되어야 하며 ]로 탈부하게 됩니다.
  • 이벤트 구동 프로그램: 양식은 ] 이벤트를 방출; 버튼 불 이벤트를 삭제합니다. 마스터링 는 비-negotiable입니다.
  • Array 메서드: ], ], ]는 렌더링을 돕고 책갈피 목록을 효율적으로 조작할 수 있습니다.

핵심 책갈피 매니저

HTML 구조

최소로 시작, semantic HTML skeleton. 양식은 책갈피의 이름과 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" />

]에서, 폼 레이아웃의 flexbox를 사용, 컨테이너의 최대 폭, 실수 클릭을 방지하기 위해 삭제 버튼을 위한 명백한 시각 피드백.

JavaScript Logic – 응용 프로그램의 심장

모든 지속력과 상호 작용력은 ]에서 살아있다. 다음 섹션은 각 기능을 깰.

Data 초기화

우리는 현재 책갈피 목록을 붙드는 중앙 가변이 필요합니다. 그것은 ]에서 초기화되어야하거나 빈 배열로 돌아갑니다.

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();

함수는 각 시간마다 배열 변경을 호출합니다. 추가, 편집 또는 책갈피를 삭제합니다. 이 저장은 항상 in-memory 배열과 동기화됩니다.

책갈피

책갈피 목록 렌더링은 ] 배열을 통해 닻 태그와 삭제 버튼을 사용하여 목록 항목을 생성하는 것을 의미합니다.

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 대신 XSS 취약점이 HTML을 포함할 때. 삭제 버튼은 bookmark의 인덱스를 캡처하기 위해 마감을 사용합니다.

즐겨찾기 추가

양식의 이벤트를 들어, 기본 페이지 다시로드를 방지하고, 책갈피 객체를 생성하고, 배열, 지속, 및 렌더링에 밀어.

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 형식을 constructor 또는 regex를 사용하여 더 검증할 수 있습니다.

책갈피

삭제는 주어진 인덱스 및 업데이트 저장 및 DOM에 항목을 제거합니다.

function deleteBookmark(index) {
 bookmarks.splice(index, 1);
 saveBookmarks();
 renderBookmarks();
}

] 을 사용하여 배열을 배치합니다. immutability를 선호한다면, 를 사용하고 를 다시 할당할 수 있지만,이 같은 작은 프로젝트의 경우, 는 명확하고 수행됩니다.

적용을 강화

기본 CRUD가 작동하면 프로토타입을 견고한 도구로 전환하는 개선을 고려합니다.

책갈피

인라인 편집 모드로 정적 이름/링크를 바꾸십시오. 사용자가 편집 버튼을 클릭하면 현재 값으로 입력된 입력 필드를 가진 앵커 태그를 교환합니다. 저장시 배열과 지속성을 업데이트하십시오.

구현 힌트: ]를 추가하여 편집 가능한 입력을 생성하는 기능. ]event delegation를 사용하여 여러 청취자를 첨부하지 않고 편집할 수 있습니다.

태그와 Categorization

선택 ] 각 bookmark 객체 (예: )에 속성을 추가합니다. 그런 다음 태그가 일치하지 않는 목록 항목을 숨기는 필터 입력으로 UI를 확장합니다. 양식 내부의 comma-separated 문자열로 태그를 저장할 수 있으며 배열로 분할 할 수 있습니다.

수입 및 수출

사용자를 백업 또는 전송 북마크에 허용하십시오. 또는 파일 다운로드를 사용하십시오. 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)에 의해 배열을 필터링하고 ]의 변형을 호출하여 일치 만 표시합니다. 원래 목록을 잃기 위해 필터링 된 복사를 저장하거나 computed 매개 변수를 사용합니다.

테스트 및 브라우저 호환성

LocalStorage는 모든 현대 브라우저에서 지원되지만 Internet Explorer의 이전 버전 (IE 8+)은 다른 API를 가지고 있습니다. 레거시 환경을 지원해야 하는 경우, polyfills로 테스트하거나 쿠키로 돌아갑니다. 오늘날 Chrome, Firefox, Safari, Edge] (Block Chromium and Legacy) 핸들 및 문제없이 처리하십시오.

테스트할 때, 확인:

  • Data는 페이지 새로 고침 및 브라우저 재시작을 살아남습니다.
  • UI 및 저장을 모두 업데이트하는 책갈피를 삭제합니다.
  • bookmark 이름의 특수 문자 (quotes, ampersands)는 올바르게 렌더링됩니다.
  • URL과 가 정상화되지 않고.

]developer tools > Application > Storage > local Storage to inspect save data by 수동으로.
자동화된 테스트를 위해, Cypress] 또는 Playwright를 사용하여 사용자 워크플로우를 시뮬레이션합니다. 양식을 작성하고, 삭제, 재활성화, 재활성화, 목록 및 목록으로 다시로드합니다.

관련 기사

이 프로젝트는 vanilla JavaScript의 몇 가지 줄이 완전히 기능, 지속적 웹 응용 프로그램을 만들 수 있는지 보여줍니다. 당신은 localStorage API] data persistence, event delegation]]를 효율적으로 UI 업데이트, CRUD operation]를 수행하기 위해, 그리고 많은 기본 설정에서 응용 프로그램을 실행하는 것은 매우 중요한 요소입니다.

이해를 깊게하려면 ]MDN 문서를 로컬 저장]에 찾아서 ]에 대한 도움말을 DOM에 저장합니다. 더 고급 상태 관리를 위해 IndexedDB를 더 큰 데이터셋 또는 서비스 근로자를 위해, 이 책은 이제 개인적인 경험을 구축할 수 있습니다.