angular2 activando manualmente un evento de clic en un elemento en particular
Estoy tratando de disparar click event (o cualquier otro evento) en element programáticamente , En otras palabras, quiero conocer las características similares que ofrece jQuery .método trigger () en angular2.
¿Hay algún método incorporado para hacer esto? ..... si no, por favor sugiera cómo puedo hacer esto
Considere el siguiente fragmento de código
<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>
Aquí cuando el usuario haga clic en el btnAdd debería disparar el evento de clic en imgFile
5 answers
Angular4
En lugar de
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
Use
this.fileInput.nativeElement.dispatchEvent(event);
Porque invokeElementMethod
ya no formará parte del renderizador.
Angular2
Use ViewChild con una variable de plantilla para obtener una referencia a la entrada del archivo, luego use el Procesador para invocar dispatchEvent
para disparar el evento:
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
Dado que el acceso directo al DOM ya no está desaconsejado por el equipo Angular, este código más simple se puede usar como bien
this.fileInput.nativeElement.click()
Véase también https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 20:17:20
También quería una funcionalidad similar donde tengo un Control de Entrada de Archivo con display:none
y un Control de botón donde quería activar haga clic en el evento del Control de entrada de archivo cuando hago clic en el botón, a continuación se muestra el código para hacerlo
<input type="button" (click)="fileInput.click()" class="btn btn-primary" value="Add From File">
<input type="file" style="display:none;" #fileInput/>
Tan simple como eso y está funcionando sin problemas...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-16 11:08:53
La respuesta de Günter Zöchbauer es la correcta. Simplemente considere agregar la siguiente línea:
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]);
}
En mi caso, obtendría un error de "rango capturado: Tamaño máximo de pila de llamadas excedido" si no. (Tengo una tarjeta div disparando al hacer clic y el archivo de entrada dentro)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 14:01:05
Esto funcionó para mí:
<button #loginButton ...
Y dentro del controlador:
@ViewChild('loginButton') loginButton;
...
this.loginButton.getNativeElement().click();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 11:36:59
Si desea imitar, haga clic en el elemento DOM de esta manera:
<a (click)="showLogin($event)">login</a>
Y tener algo como esto en la página:
<li ngbDropdown>
<a ngbDropdownToggle id="login-menu">
...
</a>
</li>
Su función en component.ts
debe ser así:
showLogin(event) {
event.stopPropagation();
document.getElementById('login-menu').click();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 09:04:49