div模拟文本框
来源:互联网 发布:地基承载力的简易算法 编辑:程序博客网 时间:2024/06/17 13:21
最近做H5页面,经常碰见实现高度自适应且计数的文本框需求,所以在这里记录一下。
其实很早之前就看了张鑫旭的“div模拟textarea文本域轻松实现高度自适应”,现在的做法也就是文章中提到的方法,主要是用到contenteditable属性。
html结构如下:
<div class="textarea_wrap"> <div id="textarea" class="textarea" name="" contenteditable="plaintext-only"></div> <span class="textnum font9"><em id="textnum">0</em>/30</span> </div>
它主要的属性值有:
contenteditable="inherit"contenteditable=""contenteditable="events"contenteditable="caret"contenteditable="typing"contenteditable="plaintext-only"contenteditable="true"contenteditable="false"
其实在模拟文本框时,常用的就是"plaintext-only"、"true","plaintext-only"可以实现可以让编辑区域只能键入纯文本
其实css中有一个属性(user-modify)也能实现让元素内只能输入纯文本,但是由于目前好像只有webkit内核支持(-webkit-),所以效果没上面好。
下面的css中有写:(针对H5,对pc的兼容性没有考虑,如有需要可参考http://www.zhangxinxu.com/wordpress/2010/12/div-textarea-height-auto/)
.textarea_wrap{ position: relative; height: 2rem; padding: 0 0.75rem; font-size: 0.7rem; color: #a3a3a3; background-color: #f7f7f7; border-top: 1px solid #ececec; border-bottom: 1px solid #ececec; } .textarea{ display: inline-block; min-height: 1rem; max-height: 6.8rem; width: 78%; outline: 0; color: #333; word-wrap: break-word; overflow-y: scroll; margin-left: 0.75rem; /* user-modify: read-write-plaintext-only; -webkit-user-modify: read-write-plaintext-only;*//*只有webkit内核支持*/ } .textnum{ position: absolute; right: 4%; bottom: 0.25rem; position: absolute; font-size: 0.45rem; em{ font-style: normal; &.flow{ color: #f77171; } } } /* font-size:9px chrome*/ .font9{ font-size: 0.45rem; } @media screen and (max-width:320px){ .font9{ font-size: 0.45rem; -webkit-transform: scale(0.75); -o-transform: scale(1); } }
首先,主要介绍一下DOMSubtreeModified事件。(参考http://www.cnblogs.com/zzsdream/p/5085619.html)
DOMSubtreeModified:在DOM结构中发生的任何变化时触发。这个事件在其他任何事件触发后都会触发。
之所以使用这个属性,是因为div上木有change事件,当手机上弹出软键盘是,采用keyup、keydown也会有问题,DOMSubtreeModified事件完美的解决的这些问题。
其次,说一下聚焦问题。当文字超出最大限制时,再次输入,光标可能出现在div内容头部,这不是我们希望的,于是用set_focus()解决。
函数里面的内容就不细说了,想要进一步了解,可自行搜索。
$("body").on('DOMSubtreeModified', '#textarea', function() { changeLength('#textarea', '#textnum', 30, 20); }); function set_focus(el) {//聚焦在文本后面 el = el[0]; //jquery 对象转dom对象 el.focus(); if ($.browser.msie) { var range = document.selection.createRange(); this.last = range; range.moveToElementText(el); range.select(); document.selection.empty(); //取消选中 } else { var range = document.createRange(); range.selectNodeContents(el); range.collapse(false); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } } function changeLength(textObj, numObj, maxLen, limitLen) {//计数 var txtval = $.trim($(textObj).text()), txtlen = txtval.length; $(numObj).text(txtlen); if (txtlen > 0) { $(textObj).next('.textarea_tips').css('display', 'none'); } else { $(textObj).next('.textarea_tips').css('display', 'block'); } if (txtlen > limitLen-1) { $(numObj).addClass('colred'); } else { $(numObj).removeClass('colred'); } if (txtlen >= maxLen) { $(textObj).text(txtval.substring(0, maxLen - 1)); $(numObj).html(txtlen); set_focus($(textObj)); } }
其实这里面还有很多坑,比如粘贴复制等等。前端就是这样,有时候很小的功能点,里面细节的东西还是挺多的。每每遇到这样的情况,那真是痛并快乐着。哈哈哈。。。
- DIV模拟文本框
- div模拟文本框
- angularjs使用div模拟textarea文本框
- DIV模拟文本编辑器【模拟QQ空间说说文本框】
- 用DIV+CSS模拟textarea,实现文本框高度自适应用户输入的文本
- 跟随文本框的DIV
- 文本框模拟键盘输入 WPF
- div contenteditable文本框placeholder属性
- 模拟文本框自动完成功能
- DIV模拟select
- DIV模拟拖动窗口
- Div 模拟 Select Demo
- div模拟textarea
- div模拟滚动条
- div模拟选择框
- div 模拟select
- css+div模拟进度条
- js+div模拟confirm
- 打开别人Xamarin项目找不到android.jar文件
- AngularJS 自定义指令
- 常见算法的实现
- IOS开发之Swift基础---输出命令行不换行!
- sklearn学习(模块列表)
- div模拟文本框
- 关于Robolectric对JNI的支持问题
- Unity02
- 分享一个通用的ListViewAdapter和Holder
- java中简单工厂模式
- Linux、MAC一些命令
- http
- Eclipse配置Git
- C#中List.Find 方法详解