angular2手动触发特定元素上的click事件

时间:2016-04-15 06:12:48

标签: angular angular2-forms

我试图以编程方式触发元素上的click事件(或任何其他事件),换句话说,我想知道angular2中jQuery .trigger()方法提供的类似功能。

   有没有内置的方法来做到这一点? .....如果没有请建议我该怎么做

考虑以下代码片段

<form [ngFormModel]="imgUploadFrm"
          (ngSubmit)="onSubmit(imgUploadFrm)">
        <br>
        <div class="input-field">
            <input type="file" id="imgFile" (click)="onChange($event)" >
        </div>
        <button id="btnAdd" type="submit" (click)="showImageBrowseDlg()" )>Add Picture</button>
 </form>

当用户点击 btnAdd 时,它应触发 imgFile

上的点击事件

6 个答案:

答案 0 :(得分:156)

<强> Angular4

而不是

    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);

使用

    this.fileInput.nativeElement.dispatchEvent(event);

因为invokeElementMethod不再是渲染器的一部分。

<强> Angular2

ViewChild与模板变量一起使用以获取对文件输入的引用,然后使用Renderer调用dispatchEvent来触发事件:

import { Component, Renderer, ElementRef, ViewChild } from '@angular/core';
@Component({
  ...
  template: `
...
<input #fileInput type="file" id="imgFile" (click)="onChange($event)" >
...`
})
class MyComponent {
  @ViewChild('fileInput') fileInput:ElementRef;

  constructor(private renderer:Renderer) {}

  showImageBrowseDlg() {
    // from http://stackoverflow.com/a/32010791/217408
    let event = new MouseEvent('click', {bubbles: true});
    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);
  }
}

<强>更新

由于Angular团队不再劝阻直接访问DOM,因此也可以使用这个更简单的代码

this.fileInput.nativeElement.click()

另见https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent

答案 1 :(得分:22)

我还想要类似的功能,我有文件输入控件 display:none按钮控件,我想触发点击事件<当我点击按钮时,文件输入控件的/ em>,下面是执行此操作的代码

<input type="button" (click)="fileInput.click()" class="btn btn-primary" value="Add From File">
<input type="file" style="display:none;" #fileInput/>

就这么简单,而且它完美无缺......

答案 2 :(得分:3)

这对我有用:

<button #loginButton ...

并在控制器内部:

@ViewChild('loginButton') loginButton;
...
this.loginButton.getNativeElement().click();

答案 3 :(得分:1)

GünterZöchbauer的答案是正确的。只需考虑添加以下行:

showImageBrowseDlg() {
    // from http://stackoverflow.com/a/32010791/217408
    let event = new MouseEvent('click', {bubbles: true});
    event.stopPropagation();
    this.renderer.invokeElementMethod(
        this.fileInput.nativeElement, 'dispatchEvent', [event]);
  }

在我的情况下,如果没有,我会得到“捕获的RangeError:超出最大调用堆栈大小”错误。 (我点击了一张div卡,输入文件在里面)

答案 4 :(得分:1)

要获取对ion-input之类的本地引用,请使用

@ViewChild('fileInput', { read: ElementRef }) fileInput: ElementRef;

然后

this.fileInput.nativeElement.querySelector('input').click()

答案 5 :(得分:0)

如果要模仿,请单击DOM元素,如下所示:

<a (click)="showLogin($event)">login</a>

,并在页面上显示以下内容:

<li ngbDropdown>
    <a ngbDropdownToggle id="login-menu">
        ...
    </a>
 </li>

您在component.ts中的功能应如下所示:

showLogin(event) {
   event.stopPropagation();
   document.getElementById('login-menu').click();
}