div之“可编辑”属性,按下“回车键”之后出现的兼容性问题的处理办法
2017-10-31 10:48
351 查看
昨天在写到一个文字输入框的时候,发现了一个问题,就是往输入框内输入表情的时候,textarea不支持dom中的插入等属性,最后没办法,在网上找到了div的一个属性,即contenteditable=”true”,让原本的div具备了可编辑的属性。
好了,废话不多说,开始甩代码。
HTML:
CSS:(因为作者是手机端,所以用rem布局的,你们换成px可以很直观的看效果)
那好了,这样的话可以编辑了,那么,,真的结束了吗?并不。因为,,,他还有兼容性的问题。笔
4000
者发现,在手机端和谷歌、ie、等浏览器上,按下回车的时候,在这个div中会自动生成div或者p,而我们需要的是生成br标签,已达到换行的目的。火狐浏览器一切正常。那接下来我们就来解决这个问题。
JS :
到此为止,解决了div可编辑问题,以及他的兼容性问题。希望恩能够帮到各位。
好了,废话不多说,开始甩代码。
HTML:
<div class="textarea" contenteditable="true" id="edit-div"></div>
CSS:(因为作者是手机端,所以用rem布局的,你们换成px可以很直观的看效果)
.textarea{ width: 2.35rem; min-height: 0.41rem; box-shadow: 0 0 0.04rem #cecece; padding: 0.1rem 0.09rem; box-sizing: border-box; border-radius: 5px; line-height: 0.18rem; font-size: 0.14rem; background: white; }
那好了,这样的话可以编辑了,那么,,真的结束了吗?并不。因为,,,他还有兼容性的问题。笔
4000
者发现,在手机端和谷歌、ie、等浏览器上,按下回车的时候,在这个div中会自动生成div或者p,而我们需要的是生成br标签,已达到换行的目的。火狐浏览器一切正常。那接下来我们就来解决这个问题。
JS :
<script type="text/javascript"> window.onload = function() { var EditDiv = { focus: false //确定当前焦点是否在编辑框内 }; document.getElementById('edit-div').onfocus = function(e) { EditDiv.focus = true; } document.getElementById('edit-div').onblur = function(e) { EditDiv.focus = false; } document.getElementById('edit-div').onkeydown = function(e) { var ev = e || window.event; var key = ev.keyCode || ev.charCode; var sel, rang, br, fixbr, node, inner, tempRange, offset; if(key == 13) { if(ev.preventDefault) { ev.preventDefault(); } else { ev.returnValue = false; } if(window.getSelection) { if(EditDiv.focus === false) { return false; } br = document.createElement('br'); sel = window.getSelection(); rang = sel.rangeCount > 0 ? sel.getRangeAt(0) : null; if(rang === null) { return false; } rang.deleteContents(); node = sel.focusNode; inner = false; while(node.parentNode != document.documentElement) { //确定focusNode是否在编辑框内 if(node === this) { inner = true; break; } else { node = node.parentNode; } } if(inner) { if(browser.chrome || browser.safari || browser.firefox) { //chrome、safari內,尾部换行是多添加一个<br type='_moz'> tempRange = rang.cloneRange(); tempRange.selectNodeContents(this); tempRange.setEnd(rang.endContainer, rang.endOffset); offset = tempRange.toString().length; if(offset == this.textContent.length && this.querySelectorAll("#edit-div br[type='_moz']").length == 0) { //在行尾且不存在<br type='_moz'>时 fixbr = br.cloneNode(); fixbr.setAttribute('type', '_moz'); rang.insertNode(fixbr); } } rang.insertNode(br); } if(document.implementation && document.implementation.hasFeature && document.implementation.hasFeature("Range", "2.0")) { tempRange = document.createRange(); tempRange.selectNodeContents(this); tempRange.setStart(rang.endContainer, rang.endOffset); tempRange.setEnd(rang.endContainer, rang.endOffset); sel.removeAllRanges(); sel.addRange(tempRange); } } else { rang = document.selection.createRange(); if(rang === null) { return false; } rang.collapse(false) rang.pasteHTML('<br>'); rang.select(); } } } } //判断浏览器 (function() { window.browser = {}; if(navigator.userAgent.indexOf("MSIE") > 0) { browser.name = 'MSIE'; browser.ie = true; } else if(navigator.userAgent.indexOf("Firefox") > 0) { browser.name = 'Firefox'; browser.firefox = true; } else if(navigator.userAgent.indexOf("Chrome") > 0) { browser.name = 'Chrome'; browser.chrome = true; } else if(navigator.userAgent.indexOf("Safari") > 0) { browser.name = 'Safari'; browser.safari = true; } else if(navigator.userAgent.indexOf("Opera") >= 0) { browser.name = 'Opera'; browser.opera = true; } else { browser.name = 'unknow'; } })(); </script>
到此为止,解决了div可编辑问题,以及他的兼容性问题。希望恩能够帮到各位。
相关文章推荐
- css样式兼容性问题的处理办法
- 升级到Android 4.2.2之后adb出现device offline的问题及解决办法
- 网页设计html+css兼容性问题处理办法汇总
- css样式兼容性问题的处理办法
- ArcGIS属性编辑字符型字段值出现乱码问题
- socket.io使用netscaler作为代理服务器进行转发时可能出现的问题及其处理办法
- VS2008编译出现问题:error C2485: “__restrict”: 无法识别的扩展属性 解决办法
- mysql mha安装以及安装出现问题处理办法
- YTKNetwork在iOS8的系统下出现闪退问题处理办法
- android 2.2版本之后,访问WebService 出现 android.os.NetworkOnMainThreadException异常 处理办法
- VS2008编译出现问题:error C2485: “__restrict”: 无法识别的扩展属性 解决办法
- linux 机器出现or type control d to continue问题的处理办法
- 是否你们遇到过Jlink重新刷完固件之后出现问题,解决办法
- 关于勒索软件问题出现后的处理办法
- Mac升级到10.13.1 之后cocoapods出现问题的解决办法
- 把一个用sql server 2005内置加密方法加密数据的DB从一台电脑备份后,还原到另外一台电脑上,出现的问题的处理办法
- No5-【原】hexo换主题之后可能出现的问题及解决办法
- [Selenium] 针对下拉菜单出现之后又立马消失的问题,通过Javascript改变元素的可见属性
- Java 处理浮点数出现的各种问题的解决办法