스마트 편집기 구축: 자동으로 URL을 감지하여 하이퍼링크로 변환
이것은 사용자 경험을 개선하기 위해 직장에서 생각해낸 아이디어입니다. 여기에는 URL을 자동으로 감지하고 사용자 유형에 따라 하이퍼링크로 변환하는 텍스트 상자를 구현하는 작업이 포함됩니다(소스 코드 Github/AutolinkEditor). 이 멋진 기능은 구현하기가 다소 까다로우며 다음 문제를 해결해야 합니다.
- 텍스트 내 URL을 정확하게 감지
- URL 문자열을 하이퍼링크로 변환한 후 커서 위치 유지
- 사용자가 하이퍼링크 텍스트를 편집할 때 그에 따라 대상 URL을 업데이트하세요
- 텍스트의 줄바꿈 유지
- 텍스트 상자의 형식과 일치하는 텍스트 스타일을 사용하여 텍스트와 줄 바꿈을 모두 유지하면서 서식 있는 텍스트 붙여넣기를 지원합니다.
... if(target && target.contentEditable){ ... target.contentEditable = true; target.focus(); } ...
전환은 "onkeyup" 및 "onpaste" 이벤트에 의해 이루어집니다. 변환 빈도를 줄이기 위해 "setTimeout"을 사용하여 지연 메커니즘이 구현됩니다. 여기서 기본적으로 사용자가 입력을 1초 동안 중지한 후에만 변환 논리가 트리거됩니다.
idle(func, delay = 1000) { ... const idleHandler = function(...args) { if(this[timer]){ clearTimeout(this[timer]); this[timer] = null; } this[timer] = setTimeout(() => { func(...args); this[timer] = null; }, delay); }; return idleHandler.bind(this); }
정규식으로 URL 식별 및 추출
URL 일치에 대한 완벽한 정규식을 만드는 데 시간을 소비할 생각이 없었기 때문에 검색 엔진을 통해 사용 가능한 정규식을 찾았습니다. 더 좋은 사람이 있으면 알려주세요!
... const URLRegex = /^(https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+))(:\d+)?(\/.*)?(\?.*)?(#.*)?$/; const URLInTextRegex = /(https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+))(:\d+)?(\/.*)?(\?.*)?(#.*)?/; ... if(URLRegex.test(text)){ result += `<a href="${escapeHtml(text)}">${escapeHtml(text)}</a>`; }else { // text contains url let textContent = text; let match; while ((match = URLInTextRegex.exec(textContent)) !== null) { const url = match[0]; const beforeUrl = textContent.slice(0, match.index); const afterUrl = textContent.slice(match.index + url.length); result += escapeHtml(beforeUrl); result += `<a href="${escapeHtml(url)}">${escapeHtml(url)}</a>`; textContent = afterUrl; } result += escapeHtml(textContent); // Append any remaining text }
변환 후 커서 위치 복원
document.createRange 및 window.getSelection 함수를 사용하여 노드 텍스트 내 커서 위치를 계산합니다. URL을 하이퍼링크로 변환하면 텍스트 내용은 수정되지 않고 태그만 추가되기 때문에 이전에 기록한 위치를 기준으로 커서를 복원할 수 있습니다. 자세한 내용은 HTML 수정 후 동일한 HTML이더라도 선택 항목을 복원할 수 없음을 참조하세요.
하이퍼링크 편집 시 업데이트 또는 제거
때로는 텍스트와 대상 URL이 동일한 하이퍼링크를 생성합니다(여기에서는 '단순 하이퍼링크'라고 함). 예를 들어 다음 HTML은 이러한 종류의 하이퍼링크를 보여줍니다.
http://www.example.com
이러한 링크의 경우 하이퍼링크 텍스트가 수정되면 대상 URL도 자동으로 업데이트되어 동기화를 유지해야 합니다. 논리를 더욱 강력하게 만들기 위해 하이퍼링크 텍스트가 더 이상 유효한 URL이 아닌 경우 링크는 일반 텍스트로 다시 변환됩니다.
handleAnchor: anchor => { ... const text = anchor.textContent; if(URLRegex.test(text)){ return nodeHandler.makePlainAnchor(anchor); }else { return anchor.textContent; } ... } ... makePlainAnchor: target => { ... const result = document.createElement("a"); result.href = target.href; result.textContent = target.textContent; return result; ... }
이 기능을 구현하기 위해 '단순 하이퍼링크'를 개체에 저장하고 onpaste, onkeyup 및 onfocus 이벤트 중에 실시간으로 업데이트하여 위 로직이 단순 하이퍼링크만 처리하도록 합니다.
target.onpaste = initializer.idle(e => { ... inclusion = contentConvertor.indexAnchors(target); }, 0); const handleKeyup = initializer.idle(e => { ... inclusion = contentConvertor.indexAnchors(target); ... }, 1000); target.onkeyup = handleKeyup; target.onfocus = e => { inclusion = contentConvertor.indexAnchors(target); } ... indexAnchors(target) { const inclusion = {}; ... const anchorTags = target.querySelectorAll('a'); if(anchorTags) { const idPrefix = target.id === "" ? target.dataset.id : target.id; anchorTags.forEach((anchor, index) => { const anchorId = anchor.dataset.id ?? `${idPrefix}-anchor-${index}`; if(anchor.href.replace(/\/+$/, '').toLowerCase() === anchor.textContent.toLowerCase()) { if(!anchor.dataset.id){ anchor.setAttribute('data-id', anchorId); } inclusion[[anchorId]] = anchor.href; } }); } return Object.keys(inclusion).length === 0 ? null : inclusion; ... }
줄 바꿈 및 스타일 처리
붙여넣은 서식 있는 텍스트를 처리할 때 편집기는 자동으로 편집기의 텍스트 스타일을 사용하여 텍스트 스타일을 지정합니다. 서식을 유지하기 위해 서식 있는 텍스트의
태그와 모든 하이퍼링크가 보존됩니다. 입력 텍스트를 처리하는 것이 더 복잡합니다. 사용자가 Enter를 눌러 새 줄을 추가하면 div 요소가 편집기에 추가되고 편집기는 서식을 유지하기 위해
로 대체합니다.
node.childNodes.forEach(child => { if (child.nodeType === 1) { if(child.tagName === 'A') { // anchar element const key = child.id === "" ? child.dataset.id : child.id; if(inclusion && inclusion[key]){ const disposedAnchor = handleAnchor(child); if(disposedAnchor){ if(disposedAnchor instanceof HTMLAnchorElement) { disposedAnchor.href = disposedAnchor.textContent; } result += disposedAnchor.outerHTML ?? disposedAnchor; } }else { result += makePlainAnchor(child)?.outerHTML ?? ""; } }else { result += compensateBR(child) + this.extractTextAndAnchor(child, inclusion, nodeHandler); } } }); ... const ElementsOfBR = new Set([ 'block', 'block flex', 'block flow', 'block flow-root', 'block grid', 'list-item', ]); compensateBR: target => { if(target && (target instanceof HTMLBRElement || ElementsOfBR.has(window.getComputedStyle(target).display))){ return "<br />"; } return ""; }
결론
이 글에서는 onkeyup 및 onpaste와 같은 일반적인 이벤트, 선택 및 범위를 사용하여 커서 위치를 복원하는 방법, 요소의 노드를 처리하여 편집기의 기능을 구현하는 방법 등 간단한 편집기를 구현하는 데 사용되는 몇 가지 실용적인 기술을 설명합니다. 기능. 정규식은 이 기사의 초점이 아니지만 완전한 정규식은 특정 문자열을 식별하는 데 있어 편집기의 견고성을 향상시킬 수 있습니다(이 기사에서 사용된 정규식은 수정을 위해 계속 열려 있습니다). 프로젝트에 도움이 되는 경우 Github/AutolilnkEditor를 통해 소스 코드에 액세스하여 자세한 내용을 얻을 수 있습니다.
위 내용은 스마트 편집기 구축: 자동으로 URL을 감지하여 하이퍼링크로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.
