angular2는 특정 요소에서 수동으로 클릭 이벤트를 발생시킵니다.


81

프로그래밍 방식으로 요소에서 클릭 이벤트 (또는 다른 이벤트)를 시작하려고합니다. 즉, 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을


당신은 필요 imgFile.click()대신 showImageBrowseDlg()당신이 @하기 Akshay-khale 의해 답변을 아래를 따른다면 stackoverflow.com/a/41675017/344029 (변수를 추가 한 후 <input #imgFile)
DJDaveMark

답변:


182

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참조하십시오.


10
this.fileInput.nativeElement.click()또한 작동합니다.
lbrahim

3
@lbrahim 맞습니다. 그 당시에는의 속성이나 메서드에 액세스하지 않고 대신 nativeElement사용 하라는 강력한 제안이었습니다 Renderer. 나는 이것이 최근에 상당히 변경되었다고 생각하며 직접적인 DOM 액세스는 이제 괜찮지 만 서버 측 렌더링 및 WebWorkers에서는 작동하지 않습니다.
Günter Zöchbauer

1
다음 사용 @AralRoca @ViewChildren('fileInput') QueryList<ElementRef>;도 참조 stackoverflow.com/questions/32693061/...
귄터 Zöchbauer

1
나는 그것에 대해 완전히 확신하지 못하고 그것을 언급하는 공식 문서를 보지 못했지만 내가 기억하는 한 일부 GitHub 문제에서 언급되었습니다. 또한 일부 문서 예제가 렌더러를 제거하고 직접 DOM 액세스를 사용하도록 업데이트 된 것을 기억해야합니다. 서버 측 렌더링이나 웹 워커를 사용하지 않으려는 인상을 받았습니다. 이것은 단지 성가신 제한 일 뿐이며 많은 개발자가 그것에 대해 신경 쓰지 않습니다. 강력한 규칙.
Günter Zöchbauer

1
@ManuChadha 왜 jquery를 사용합니까? Angular와 jquery가 둘 다 FOM을 완전히 제어한다고 생각할 때 문제가 발생할 수 있습니다. jquery는 브라우저 간의 차이가 훨씬 적고 대부분의 사람들이 이전 브라우저에 대한 지원을 완전히 중단했기 때문에 최근에 훨씬 덜 관련성이 높아졌습니다.
Günter Zöchbauer

27

나는 또한 내가 가지고 비슷한 기능을 원하는 파일 입력 제어display:noneButton 컨트롤 I 트리거에 원 클릭 이벤트 내가 버튼을 클릭 파일 입력 컨트롤을 아래 그렇게 할 수있는 코드

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

그렇게 간단하고 완벽하게 작동합니다 ...


1
: 나는 정확히이 텍스트 필드에 입력 타격 후 버튼을 클릭하는 데 사용<input #name type="text" (keyup.enter)="addBtn.click()"> <button #addBtn (click)="add(name.value)" type="button">Add</button>
DJDaveMark

4

이것은 나를 위해 일했습니다.

<button #loginButton ...

컨트롤러 내부 :

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

고마워 친구. ionic3의 매력처럼 작동했습니다. :)
DwlRathod

Angular 7+에서는 작동하지 않습니다
davejoem

2

Günter Zö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]);
  }

제 경우에는 "Caught RangeError : Maximum call stack size exceeded"오류가 발생합니다. (클릭시 div 카드가 실행되고 내부에 입력 파일이 있습니다)


1
또한 DOM 트리 버블 링에서 이벤트를 방지 false로 "거품"키를 설정할 수 있습니다
ChicoDelaBarrio

2

다음과 같이 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();
}

0

와 같은 것에 대한 기본 참조를 얻으려면 다음을 ion-input사용하십시오.

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

그리고

this.fileInput.nativeElement.querySelector('input').click()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.