在按钮单击时将文本添加到现有输入字段

Posted

技术标签:

【中文标题】在按钮单击时将文本添加到现有输入字段【英文标题】:Add Text to an Existing Input Field on Button Click 【发布时间】:2018-01-31 06:33:14 【问题描述】:

我正在创建一个网站,该网站的管理员会定期发布文章(很像博客)。作为管理员,我可以轻松编写基本的 html 文档,但其他管理员对 HTML 完全不熟悉。

我有一个表单,他们将使用该表单发布带有作者、标题和内容字段的文章。我目前正在使用“内容”字段并在提交表单后将其显示为 HTML。为了帮助其他用户,我添加了“标题”、“段落”、“图像”和“换行符”按钮。单击这些按钮时,我想将 html 标记添加到现有字段(通常已经填充了文章文本)。

想法是这样的:

我单击段落按钮,我的字段显示如下: “<p>type here</p>”。 然后我输入段落并换行。我决定在它之后添加一个子标题并单击标题按钮:

<p>I replaced the text</p>
<h3>type sub-heading here</h3>

我不希望按钮以任何方式创建新输入或添加到表单中。我也不希望它替换或重置那里的文本,而只是在光标所在的位置添加文本。我找到了很多方法来添加表单字段、替换它们、隐藏它们等,但无法挖掘任何关于使用按钮编辑现有文本的帖子。

有人知道我该怎么做吗?我使用 angular 2 作为框架,因此任何适合它的解决方案(javascript、typescript、angular 2 数据绑定等)都可以使用。

这是我的 HTML:

<div class="edit-article">
  <h2 *ngIf="isEdit">Edit an Article</h2>
  <h2 *ngIf="!isEdit">Add an Article</h2>
  <div class="input-group">
    <label for="title">Title</label>
    <input mdInput id="title" type="text" [(ngModel)]="title">

    <label for="author">Author</label>
    <input mdInput id="author" type="text" [(ngModel)]="author">

    <label for="article-content">Content</label>
    <input mdInput id="article-content" type="textarea" class="multi-line-input" [(ngModel)]="content">
  </div>
  <div class="button-group left">
    <button class="button secondary" (click)='onAddHeader()'>Header</button>
    <button class="button secondary" (click)='onAddParagraph()'>Paragraph</button>
    <button class="button secondary" (click)='onAddImage()'>Image</button>
  </div>
  <div class="button-group right">
    <button class="button primary" (click)="onSaveArticle()">Save</button>

TS 文件:

export class ArticleEditComponent 
  isEdit = false;

  public title: string;
  public author: string;
  public content: string;

  constructor(
    public dialogRef: MdDialogRef<any>, @Inject(MD_DIALOG_DATA) private dialogData: any,
    public afAuth: AngularFireAuth, public afDB: AngularFireDatabase,
    public articleService: ArticleService) 
  

  onSaveArticle() 
    this.articleService.createArticle(new Article(
    this.title, this.author, this.content));
  

onAddHeader()
    document.getElementById("article-content").innerText += '<h3></h3>';
    console.log('running header function');
  

  onAddImage()
    document.getElementById("article-content").innerText += 'add image tag';
    console.log('running header function');
  

  onAddParagraph()
    document.getElementById("article-content").innerText += '<p></p>';
    console.log('running header function');
  

【问题讨论】:

【参考方案1】:

以下是您可以调整的示例:

HTML:

<input #input type="text">
<button (click)="addText()">Click me to add some text</button>
<button (click)="reset()">Reset</button>

TypeScript:

  @ViewChild('input') private input;

  addText()
    this.input.nativeElement.focus();
    let startPos = this.input.nativeElement.selectionStart;
    let value = this.input.nativeElement.value;
    this.input.nativeElement.value= 
    value.substring(0, startPos) +' I am inserted ' + value.substring(startPos, value.length)
  

  reset()
      this.input.nativeElement.value='';
  

Plunker

【讨论】:

我确实检查了这个并且它有效,但是对于一个 Angular 2 项目,使用 Angular 数据绑定的另一个答案要简单得多,编码也少得多。 好点。另一种方式只添加到末尾,而不是光标处。出于这个原因,这种方式很好。 如果输入框和按钮是由两个不同的组件渲染的,如何使用这个方案?在这种情况下,#input 未定义。 @Tanmoy Bhattacharjee,你的意思是 input.focus() ?将其移至代码。您已经通过 ViewChild 获得了参考。 我有两个组件。一个组件有输入,另一个组件有一个按钮现在我有按钮的组件我已将代码移动到.ts,但它仍然以未定义的输入 html 的形式出现: html: 点我!! .ts: @ViewChild('input') 私人输入; addText(event) console.log(this.input); //这是未定义的 【参考方案2】:

如果您使用的是 ngModel,则相应输入字段中的任何内容都将绑定到您列出的变量。

<input mdInput id="title" type="text" [(ngModel)]="title">

用户键入的任何内容都将绑定到上述输入中的“title”变量,您可以在组件或模板中的任何位置修改该变量,它将反映在视图中。因此,如果您只想在输入字段中添加文本,您可以执行以下操作:

<button class="button secondary" (click)="title = '<p> type here </p>' + title">Paragraph</button>

或者你可以在组件代码中实现

<button class="button secondary" (click)="addText()">Paragraph</button>


 ...somewhere in your component....

addText() 
   f.title = '<p> type here </p>' + f.title;

(以上假设您已将表单包装在 ngForm 组中,并为其赋予标识符 #f ,就像他们在这里所做的那样:https://angular.io/api/forms/NgForm)

该方法会将该文本添加到标题输入字段中已有内容的开头(注意:您可能必须转义该反斜杠,我不记得了)。您根本不需要使用 document.getElementById 查询。在 Angular 中最好避免这些。如果你使用的是 ngModel,你也不应该真的需要访问 innerText 属性。 2-way binding的美妙之处在于它基本上已经以'title'变量的形式为您提供了innerText属性。事实上,几乎总是可以避免访问文档对象和 nativeElement 属性,并且应该尽可能避免。

如果您还没有,您可能需要从“@angular/forms”导入 NgForm。我不记得没有它 ngModel 是否可以正常工作。

【讨论】:

很棒的答案。我不敢相信我没想过只编辑我绑定表单的变量。我刚做了这个,它就像一个魅力。 我使用了你展示的第二种方法。当我单击按钮时,我更改了“this.content”以添加标签。

以上是关于在按钮单击时将文本添加到现有输入字段的主要内容,如果未能解决你的问题,请参考以下文章

Android - 按下按钮时将文本视图添加到布局

单击外部按钮时将代码添加到CKeditor

当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)

单击按钮时将单元格动态添加到 UItableview

单击按钮时输入附件视图

如何在按钮单击时将新行添加到数据库中的jTable而不清除现有行