paste 이벤트 발생 시 jQuery로 바인딩 하여
정규식을 이용해 개행문자를 제외한 모든 테그를 제거하고
selection과 range를 이용하여 커서위치에 붙여넣기 기능
//-- 방법1. 정규식으로 개행문자를 제외한 테그를 모두 바꾼 후 insertNode로 한번에 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <code>$( "#editor_area" ).on( 'paste' , function (e) { var clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData; var pasteVal = clipboardData.getData( 'text' ); pasteVal = pasteVal.replace(/<(\/)?br>/gi, "##BR##" ).replace(/<[^>]+>/g, '' ).replace(/##BR##/g, ' ' ).replace(/\r\n/g, ' ' ); var selection = window.getSelection(); var selRange = selection.getRangeAt(0); if (!selection.rangeCount) return false ; selection.deleteFromDocument(); selRange.insertNode(selRange.createContextualFragment(pasteVal)); e.preventDefault(); }); </code> |
//-- 방법2. 상위div 만들어서 감싸고 insertNode로 추가하는 법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <code>$( "#editor_area" ).on( 'paste' , function (e) { var clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData; var pasteVal = clipboardData.getData( 'text' ); var pasteValArr = pasteVal.split(/\r\n|\r|\n/gi); var selection = window.getSelection(); if (!selection.rangeCount) return false ; selection.deleteFromDocument(); var fullNode = document.createElement( "div" ); for ( var i=0; i<pasteValArr.length; i++ ){ pasteValArr[i] = pasteValArr[i].replace(/<[^>]*>/g, "" ); if ( pasteValArr[i] == "" ) { var newNode = document.createElement( "div" ); newNode.appendChild(document.createElement( "br" )); } else { var newNode = document.createElement( "div" ); newNode.appendChild(document.createTextNode(pasteValArr[i])); } fullNode.appendChild(newNode); } selection.getRangeAt(0).insertNode(fullNode); e.preventDefault(); }); </code> |
//-- 방법3. 개행문자로 쪼갠 후 배열을 뒤집어서 insertNode 로 하나씩 추가하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <code>$( "#editor_area" ).on( 'paste' , function (e) { var clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData; var pasteVal = clipboardData.getData( 'text' ); var pasteValArr = pasteVal.split(/\r\n|\r|\n/gi); var selection = window.getSelection(); if (!selection.rangeCount) return false ; selection.deleteFromDocument(); pasteValArr = pasteValArr.reverse(); for ( var i=0; i<pasteValArr.length; i++ ){ pasteValArr[i] = pasteValArr[i].replace(/<[^>]*>/g, "" ); if ( pasteValArr[i] == "" ) { var newNode = document.createElement( "div" ); newNode.appendChild(document.createElement( "br" )); } else { var newNode = document.createElement( "div" ); newNode.appendChild(document.createTextNode(pasteValArr[i])); } selection.getRangeAt(0).insertNode(newNode); } e.preventDefault(); }); </code> |
//--방법4. 부모 노드에 appendChild로 추가하는 법 (노드중간에다가 추가할때 에러 발생)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <code>$( "#editor_area" ).on( 'paste' , function (e) { var clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData; var pasteVal = clipboardData.getData( 'text' ); var pasteValArr = pasteVal.split(/\r\n|\r|\n/gi); var selection = window.getSelection(); if (!selection.rangeCount) return false ; selection.deleteFromDocument(); for ( var i=0; i<pasteValArr.length; i++ ){ pasteValArr[i] = pasteValArr[i].replace(/<[^>]*>/g, "" ); if ( pasteValArr[i] == "" ) { var newNode = document.createElement( "div" ); newNode.appendChild(document.createElement( "br" )); } else { var newNode = document.createElement( "div" ); newNode.appendChild(document.createTextNode(pasteValArr[i])); } selection.anchorNode.appendChild(newNode); } e.preventDefault(); }); </code> |
'프로그래밍 > javascript' 카테고리의 다른 글
[javascript] 자주 사용하는 정규식 메모 (0) | 2020.05.21 |
---|---|
[javascript] 브라우저 IE 감지 (0) | 2020.05.21 |
[Javascript] 글자수 체크, 문자열 길이 구하기(한글 포함) (0) | 2020.05.21 |
[React] CentOS7 / React + create-react-app + yarn + Node js 환경 구축 (0) | 2019.07.02 |
[jQuery] file type 예외처리 (0) | 2019.04.30 |