angle2は特定の要素でクリックイベントを手動で発生させます


82

プログラムで要素に対してクリックイベント(またはその他のイベント)を発生させようとしています。言い換えると、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

回答:


184

Angular4

の代わりに

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

使用する

    this.fileInput.nativeElement.dispatchEvent(event);

invokeElementMethodレンダラーの一部ではなくなるためです。

Angular2

テンプレート変数とともにViewChildを使用してファイル入力への参照を取得し、次にレンダラーを使用して呼び出し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 2016

3
@lbrahimその通りです。当時は、プロパティやメソッドにアクセスせず、代わりにnativeElement使用することを強くお勧めしていRendererました。これは最近かなり変更されたと思います。現在、直接DOMアクセスは問題ありませんが、サーバー側のレンダリングとWebWorkersでは機能しません。
ギュンターZöchbauer

1
その後、使用@AralRoca@ViewChildren('fileInput') QueryList<ElementRef>;も参照stackoverflow.com/questions/32693061/...
ギュンターZöchbauer

1
私はそれについて完全には確信がなく、それについて言及している公式のドキュメントを見たことがありませんが、私が覚えている限り、それはいくつかのGitHubの問題で言及されていました。また、一部のドキュメントの例が更新され、レンダラーが削除され、直接DOMアクセスが使用されることを覚えていると思います。サーバーサイドレンダリングやWebワーカーを使用するつもりがない場合、それは面倒な制限であり、非常に多くの開発者がそれを気にしないという印象を受けました。強いルール。
ギュンターZöchbauer

1
@ManuChadhaなぜjqueryを使用するのですか?Angularとjqueryが両方ともFOMを完全に制御していると考えると、問題が発生する可能性があります。ブラウザ間の違いがはるかに少なく、古いブラウザのサポートがほとんど完全に廃止されたため、jqueryの関連性は最近はるかに低くなっています。
ギュンターZöchbauer

27

また、ファイル入力コントロールボタンコントロールdisplay:noneあり、ボタンをクリックしたときにファイル入力コントロールのクリックイベントをトリガーしたい同様の機能が必要でした。以下はそのためのコードです。

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

2

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カードが起動し、入力ファイルが内部にあります)


1
「バブル」キーをfalseに設定して、イベントが
DOM

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

1

のようなものへのネイティブ参照を取得するにはion-input、これを使用してry

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

その後

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

どうもありがとうございます!私はこれをIonicで機能させるために頭を悩ませていました。乾杯
fromage97 4720

あなたは歓迎されている
davejoem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.