在div中使用contenteditable=”true”可以達到模擬輸入框的效果,但是當我們復制其他網頁內容進去的時候,會發現連帶的樣式也一起復制進去了。很明顯我們不需要復制富文本樣式,那么如何過濾這些標簽呢?
查閱資料,發現如果只保證支持HTML5的webkit內核瀏覽器,目前有一些方法如下:
方法一:
1 <div contenteditable="plaintext-only" id="content"></div>
熊貓辦公 https://www.wode007.com/sites/73654.html
方法二:基於css
1 user-modify: read-write-plaintext-only; 2 -webkit-user-modify: read-write-plaintext-only
如果在非 webkit 的內核,我們需要考慮使用js來實現,首先想到的是:
1 var d= document.getElementById( "content" ); 2 document.addEventListener( "keydown", function() { 3 d.innerHTML = d.innerHTML.replace( /<[^>]*>/g, "" ); 4 });
發現效果同上面大體一樣,這樣雖然能過濾樣式,但是有很多問題,比如光標始終在首位、輸入框不能插入表情、換行符失效等問題。 上網查了一下別人是怎么做的發現可以通過修改復制事件來過濾樣式:
1 function pasteFilter(e){ 2 e.preventDefault(); 3 var text = null; 4 //得到剪貼板中的文本 5 if(window.clipboardData && clipboardData.setData) { 6 // IE 7 text = window.clipboardData.getData('text'); 8 }else{ 9 try{ 10 text = (e.originalEvent || e).clipboardData.getData('text/plain'); 11 }catch(e){ 12 return; 13 } 14 }; 15 if (document.body.createTextRange) { 16 if (document.selection) { 17 textRange = document.selection.createRange(); 18 } else if (window.getSelection) { 19 sel = window.getSelection(); 20 var range = sel.getRangeAt(0); 21 // 創建臨時元素,使得TextRange可以移動到正確的位置 22 var tempEl = document.createElement("span"); 23 tempEl.innerHTML = "&#FEFF;"; 24 range.deleteContents(); 25 range.insertNode(tempEl); 26 textRange = document.body.createTextRange(); 27 textRange.moveToElementText(tempEl); 28 tempEl.parentNode.removeChild(tempEl); 29 }; 30 textRange.text = text; 31 textRange.collapse(false); 32 textRange.select(); 33 } else { 34 // Chrome之類瀏覽器 35 document.execCommand("insertText", false, text); 36 }; 37 }; 38 var d= document.getElementById( "content" ); 39 d.addEventListener("keydown",function(e){ 40 if (e.ctrlKey || e.metaKey) { 41 if(e.keyCode==117){ 42 pasteFilter(e); 43 } 44 } 45 },false);
