Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

angular2 manually firing click event on particular element

I am trying to fire click event (or any other event) on element programatically , In other word I want to know the similar features as offered by jQuery .trigger() method in angular2.

Is there any built in method to do this? ..... if not please suggest how can i do this

Consider the following code fragment

<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> 

Here when user click the btnAdd it should fire the click event on imgFile

like image 617
Jorin Avatar asked Apr 15 '16 06:04

Jorin


People also ask

How do you fire a click event on an element?

The HTMLElement. click() method simulates a mouse click on an element. When click() is used with supported elements (such as an <input> ), it fires the element's click event. This event then bubbles up to elements higher in the document tree (or event chain) and fires their click events.

How do I trigger a click event without clicking?

If you want to trigger click event without clicking a button manually, then you should use the click() method in Javascript. Example : click button on page load dynamically. For that we will create a button with an id my-btn . So that, we can select the button using the getElementById() method.

How do you programmatically trigger click event in Angular 4 and 5?

getElementById() and is casted to an HTMLElement type. HTMLElement represents any element in the document and implements Event Handler interface, so now we can call click() . Successfully, the file browser is triggered to open.

How to create a click event in Angular?

The key to setting a click event handler in an Angular template is the (click) attribute, and you now know that you can take one of two approaches: 1) you can assign a valid JavaScript expression to the (click) attribute, for example: “count = count + 1” or, 2) you can assign a method to the (click) attribute, as long ...


2 Answers

Angular4

Instead of

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

use

    this.fileInput.nativeElement.dispatchEvent(event); 

because invokeElementMethod won't be part of the renderer anymore.

Angular2

Use ViewChild with a template variable to get a reference to the file input, then use the Renderer to invoke dispatchEvent to fire the event:

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]);   } } 

Update

Since direct DOM access isn't discouraged anymore by the Angular team this simpler code can be used as well

this.fileInput.nativeElement.click() 

See also https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent

like image 200
Günter Zöchbauer Avatar answered Oct 21 '22 00:10

Günter Zöchbauer


I also wanted similar functionality where I have a File Input Control with display:none and a Button control where I wanted to trigger click event of File Input Control when I click on the button, below is the code to do so

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

as simple as that and it's working flawlessly...

like image 21
Akshay Khale Avatar answered Oct 21 '22 00:10

Akshay Khale