突出显示textarea angular 8中的特定单词

Posted

技术标签:

【中文标题】突出显示textarea angular 8中的特定单词【英文标题】:Highlight specific words in textarea angular 8 【发布时间】:2021-06-28 03:42:00 【问题描述】:

我正在尝试从 textarea 中选择几个单词并创建引导芯片。

我能够为选定的单词创建筹码。我正在尝试用不同的背景颜色突出显示选定的单词。

export class SearchComponent implements OnInit 

  constructor()  

  selectedText = [];
  regexFromMyArray: RegExp;

  // tslint:disable-next-line:typedef
  showSelectedText() 
    let text = '';
    if (window.getSelection) 
      text = window.getSelection().toString();
      if (text) 
        // console.log(this.selectedText.includes(text));
        if (this.selectedText.includes(text) === false)
        
          this.selectedText.push(text);
          this.regexFromMyArray = new RegExp(this.selectedText.join('|'), 'ig');
          console.log(this.regexFromMyArray);
        
        
    
    // console.log(this.selectedText);
    return this.selectedText;
  

  // tslint:disable-next-line:typedef
  removeItem(array, item)
    for (const i in array)
      if (array[i] === item)
        array.splice(i, 1);
        break;
      
    
  

  // tslint:disable-next-line:typedef
  deleteChip(el) 
    // el.style.display = 'none';
    document.getElementById(el).style.display = 'none';
    this.removeItem(this.selectedText, el);
  



  ngOnInit(): void 
  


我不确定如何突出显示 selectedText 数组中的单词。我想突出显示所有芯片单词。像“相反”、“Ipsum”、“古典”、“文学”。

我们将不胜感激。

【问题讨论】:

codersblock.com/blog/highlight-text-inside-a-textarea 一种方法是用' word-to-be-higlighted'替换所有要突出显示的单词,基本上用跨越。但请务必牢记脚本攻击。 【参考方案1】:

此答案基于@RobinDijkhof 在评论中提供的链接。

我们将完全按照提供的方式设置 css

*,
*::before,
*::after 
  box-sizing: border-box;


.container,
.backdrop,
textarea 
  width: 460px;
  height: 180px;


.highlights,
textarea 
  padding: 10px;
  font: 20px/28px "Open Sans", sans-serif;
  letter-spacing: 1px;


.container 
  display: block;
  margin: 0 auto;
  transform: translateZ(0);
  -webkit-text-size-adjust: none;


.backdrop 
  position: absolute;
  z-index: 1;
  border: 2px solid #685972;
  background-color: #fff;
  overflow: auto;
  pointer-events: none;
  transition: transform 1s;


.highlights 
  white-space: pre-wrap;
  word-wrap: break-word;
  color: transparent;


textarea 
  display: block;
  position: absolute;
  z-index: 2;
  margin: 0;
  border: 2px solid #74637f;
  border-radius: 0;
  color: #444;
  background-color: transparent;
  overflow: auto;
  resize: none;
  transition: transform 1s;


mark 
  border-radius: 3px;
  color: transparent;
  background-color: #b1d5e5;


.perspective textarea 
  transform: perspective(1500px) translateX(155px) rotateY(45deg) scale(1.1);


textarea:focus,
button:focus 
  outline: none;
  box-shadow: 0 0 0 2px #c6aada;


现在的任务是将 JQuery 代码转换为 Angular。我们将构建一个可以像这样使用的组件

<app-textarea-highlight [(ngModel)]='txt'
  [highlightTexts]='highlightTexts'

></app-textarea-highlight>

值在哪里

  highlightTexts = ["text", "demo", "div"];
  txt = "This demo shows how to highlight bits of text within a textarea. Alright, that's a lie. You can't actually render markup inside a textarea. However, you can fake it by carefully positioning a div behind the textarea and adding your highlight markup there. 

为了使用属性绑定,我们将实现ControlValueAccessor

下面是代码

@Component(
  selector: "app-textarea-highlight",
  templateUrl: "./textarea-highlight.component.html",
  styleUrls: ["./textarea-highlight.component.css"],
  providers: [
    
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TextareaHighlightComponent),
      multi: true
    
  ]
)
export class TextareaHighlightComponent
  implements  ControlValueAccessor 
  constructor() 
  @Input() highlightTexts: string[] = [];
  @ViewChild("backdrop") $backdrop: ElementRef<HTMLDivElement>;
  @ViewChild("textarea") $textarea: ElementRef<HTMLTextAreaElement>;
  textValue: string = "";
  get highlightedText () 
    return this.applyHighlights(this.textValue)
  

  applyHighlights(text) 
    text = text ? text
      .replace(/\n$/g, "\n\n") : '';
    this.highlightTexts.forEach(x => 
      text = text
      .replace(new RegExp(x, 'g'), "<mark>$&</mark>");
    )
    return text;
    
  
  handleScroll() 
    var scrollTop = this.$textarea.nativeElement.scrollTop;
    this.$backdrop.nativeElement.scrollTop = scrollTop;

    var scrollLeft = this.$textarea.nativeElement.scrollLeft;
    this.$backdrop.nativeElement.scrollLeft = scrollLeft;
  

  onChanges: ($value: any) => void;
  onTouched: () => void;

  writeValue(value: any): void 
    if (value !== undefined) 
      this.textValue = value;
    
  
  registerOnChange(fn: any): void 
    this.onChanges = fn;
  
  registerOnTouched(fn: any): void 
    this.onTouched = fn;
  

最后一步是设置html

<div class="container">
  <div #backdrop class="backdrop">
    <div class="highlights" [innerHTML]="highlightedText"></div>
  </div>
  <textarea
    [(ngModel)]="textValue"
    (scroll)="handleScroll()"
    #textarea
  ></textarea>
</div>

See Working Demo Here

【讨论】:

【参考方案2】:

你可以试试这个。

HTML

<span class="highlightText">Your text</span>

CSS

.highlightText 
    background: yellow;

另一个提示 任何与 CSS 文本相关的属性都会影响 textarea/input 中的整个文本。您需要一个可编辑的元素或文档来实现语法高亮。示例(适用于所有最近的浏览器;最后一个不支持 contenteditable 的主要浏览器是 Firefox 2.0):

<code contenteditable="true">
  <span style="color: blue">var</span> foo = <span style="color: green">"bar"</span>;
</code>

【讨论】:

以上是关于突出显示textarea angular 8中的特定单词的主要内容,如果未能解决你的问题,请参考以下文章

使用javascript按下开始按钮时,我应该如何突出显示textarea中的文本?

突出显示 textarea 中的所有文本

如何更改 Java Swing TextArea 中的突出显示颜色?此外,更改与突出显示位置对应的文本的开头

在 JavaFX TextArea 中突出显示字符串

正在寻找一种在 textareas 中突出显示特定单词的方法?

如何在文本区域(坐标)角度中获取位置突出显示的文本?