【问题标题】:Contenteditable DIV is not working properly with angular two way binding in firefoxContenteditable DIV 无法在 Firefox 中使用 Angular 双向绑定正常工作
【发布时间】:2018-12-14 19:23:15
【问题描述】:

我已将我的 div 设为可内容编辑的 div,它还会在 keyup 上打开 ngx-popover,并根据 searchText 将搜索结果填充到弹出窗口中,因此我需要两种方式绑定以及可进一步编辑的内容div 而不是输入:

<span>
   <div id="contenteditablediv" contenteditable="true" (keyup)="triggerUserSearch()" type="text" [popover]="searchTemplate"
        placement="bottom"  triggers="keyup click" [textContent]="searchText" (input)="searchText=$event.target.textContent" [outsideClick]="true"
        containerClass="searchUsersPopup" placeholder="To" class="recipientInput searchTerm">{{searchText}}
   </div>
</span>

但是当我添加下面的代码行时:

(input)="searchText=$event.target.textContent"

它在 Firefox 浏览器中无法正常工作。当您将光标放在末尾时,它会在 Firefox 中向后键入。

我从下面的Plunker 中获取了参考,这在 Firefox 中也无法正常工作。
也发生同样的事情 SO AnswerPlunker

我不确定(input)="searchText=$event.target.textContent" 代码究竟做了什么。但它绑定了 searchText 和 div 值。 所以它是必需的,但它也引起了问题。 如果可能,请解释上述代码的含义。谢谢!

【问题讨论】:

    标签: angular contenteditable


    【解决方案1】:

    (输入)

    当输入或文本区域元素中有内容时触发输入事件 有变化,当元素发生变化时它也会被触发 具有 contenteditable 属性。

    由于 contenteditable 元素没有更改事件输入被使用 检查更改事件,Mozilla 有一些关于错误插入符号位置的错误。

    (input)="searchText=$event.target.textContent"
    

    如果您从 div 中删除此行,它将在 Mozilla 中正常工作!

    而且你不需要这个来获取 (input)="searchText=$event.target.textContent" 的 div 值,你可以简单地使用 ViewChild 装饰器来获取 div 的值

    @ViewChild('ref') ref:ElementRef; 
     triggerUserSearch(){
           console.log(this.ref.nativeElement.innerHTML);
      }
    

    在此处查看示例:https://stackblitz.com/edit/input-event

    【讨论】:

    • 效果很好。非常感谢。但是我无法理解您所说的“以及跟踪您当前的输入插入符号位置并继续将插入符号推到输入的开头”是什么意思。以及为什么问题只存在于 Firefox 而不是 chrome。
    • 我会在 22 小时后奖励赏金 :)
    • 不客气!... 这是 mozilla 错误:bugzilla.mozilla.org/show_bug.cgi?id=1020973
    • 在您的 StackBlitz 示例中,triggers="keyup click" 做了什么?
    • @Dave 这是我为 ngx-bootstrap popover 实现的代码的一部分,因为我在 keyup 上显示 popover 并单击此输入,chellappan 添加了它,因为它存在于我的代码中。
    【解决方案2】:

    在 .html 中:

    <div (blur)="getContent($event.target.innerHTML)" contenteditable [innerHTML]="content"></div>
    

    在 .ts 中:

    getContent(innerText){
      this.content = innerText;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多