form表单数据部分字符修改样式

需求:输入框内遇到问号"?"变红加粗

 难点:在input中直接用正则表达式给"?"加样式标签,是无法读取样式的,会直接显示标签,如图所示:

解决方案:

方法一:加一层span,覆盖在input上

原理:初始化时只显示span,单击后隐藏span,显示input,此时可编辑。失去焦点时隐藏input,显示span,带样式。

html如下:

<td>
  <input id="x" style="display: none" (blur)="read()" formControlName="businessPhoneNumber" matInput>
  <div id="z" style="display: block; width: 100%; height: 100%" (click)="edit()">
    <span id="y" style="display: block; width:100%; height: 100%">
    {{businessPhoneNumberValue}}
    </span>
  </div>
</td>

js/ts 如下:read()是切换到只读状态的span ,edit()是切换到可编辑的input。

  get businessPhoneNumberValue(): string {
    var y = document.getElementById("y");
    const inputText = this.formApplicant.get("businessPhoneNumber")?.value ?? "";
    y.innerHTML = inputText.replace(new RegExp("[?]", "g"), '<strong>' + '<font color="red">?</font>' + '</strong>');
    return y.innerHTML; //初始化时取到表单数据并加上样式
  }
  read() {
    var x = document.getElementById("x");
    var y = document.getElementById("y");
    var z = document.getElementById("z");
    x.style.display = "none";
    y.style.display = "block";
    z.style.display = "block";
    z.style.width = "100%";
    z.style.height = "100%"; //注意设置宽高和原input刚好一致
    const inputText = this.formApplicant.get("businessPhoneNumber")?.value ?? "";
    y.innerHTML = inputText.replace(new RegExp("[?]", "g"), '<strong>' + '<font color="red">?</font>' + '</strong>'); //取到input里的值,给所有"?"加上样式标签
  }
  edit() {
    var x = document.getElementById("x");
    var y = document.getElementById("y");
    var z = document.getElementById("z");
    x.style.display = "block";
    y.style.display = "none";
    z.style.display = "none";
    window.document.getElementById("x").focus();  //聚焦到输入框
  }

过程中遇到几个小问题:
1.初始化数据之后,点两下输入框才能编辑。解决方案:click时自动聚焦到输入框window.document.getElementById("x").focus(); 
2.input值为空的话就点不了,编辑不了。解决方案:html里把div和span设置初始宽度高度100%。
3.应用到多个字段比较麻烦。解决方案:封装,传参。
缺点:编辑时,不能同步样式。

方法二:引入富文本编辑器tinymce,绑定form

html如下:

<editor formControlName="businessPhoneNumber"
[init]="tinymceSetting"
style="height: 17px;width: 150px;"></editor>

js/ts文件如下: 

tinymceSetting = {
    plugins: [
      'paste textcolor colorpicker textpattern',
      'bbcode',  //解析html标签的插件
      'fullpage',
      'autoresize',  //调整尺寸样式的插件
    ],
    menubar: false,
    toolbar: false,  //把不需要的工具栏都去掉,只要输入框
    statusbar: false,
    autoresize_on_init: true,
    autoresize_overflow_padding: 0,
    autoresize_bottom_margin: 0,
    setup: editor => {
      editor.on('keyup change', () => {  //输入字符实时更新样式
        var content = editor.getContent().replace(new RegExp("[?]", "g"), "[color=red][b]?[/b][/color]");
        this.onEditorContentChange.emit(content);
      });
    }
  };

tinymce的插件配置文件:plugin.js,在html2bbcode和bbcode2html函数里分别加一句:

rep(/\?/gi, '<strong>'+'<font color="red">?</font>'+'</strong>');

但仍存在诸多问题:
1.plugin.js里加的作用是初始化的时候修改问号的样式,但是编辑数据的时候,不生效。如果在component.ts里也加上样式标签的替换,则会重复判断,标签越加越多。
2.数据格式变了,传给后台会带html标签,可以通过content.match(/\d+/g).join('');去标签化。
3.编辑器初始样式难调整,tinymce6.0删除了一些样式配置,如编辑器内文本的margin。
4.点别的标签页再切过来的时候,编辑器没了。
缺点:数据绑定困难,要安依赖包插件,增加页面加载时间。故不推荐该方法。

如有大佬知道解决办法,欢迎评论留言~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值