質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

Q&A

解決済

4回答

1923閲覧

動的に生成するDOM要素にイベントバインディングを割り当てたい

wizz

総合スコア7

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

0グッド

0クリップ

投稿2017/09/20 08:33

編集2017/09/20 10:38

###前提・実現したいこと

動的に生成したinputにフォーカスが当たった時にアラートを出したいと考えて入るのですが、
呼び出されません...

templateで定義した、

html

1<button (click)="addInput()">ADD</button>

は正しく呼び出すことができるのですが、
動的に生成した、

html

1<input type="text" (focus)="focusFunc()" />

は動作しません。

ChoromeのDeveloper Toolsで確認したところ、以下のように
なっていました。

html

1<!-- templateで定義 --> 2<button _ngcontent-c0>ADD</button> 3 4<!-- 動的に生成 --> 5<input type="text" (focus)="focusFunc()" />

イベントバインディングがそのまま表示されてしまっているので、
DOMに追加後に何か処理を行わないといけないのでしょうか?
初歩的な質問で申し訳ないのですが、アドバイスをよろしくお願い致します。

###該当のソースコード

typescript

1import { 2 Component, 3} from '@angular/core'; 4 5@Component({ 6 selector: 'app-root', 7 template: ` 8 <div id="hoge"> 9 <button (click)="addInput()">ADD</button> 10 </div> 11 `, 12}) 13 14export class AppComponent { 15 addInput() { 16 let elm = document.getElementById('hoge'); 17 let divElm = document.createElement('div'); 18 divElm.innerHTML = '<input type="text" (focus)="focusFunc()" />'; 19 elm.appendChild(divElm); 20 } 21 22 focusFunc() { 23 alert('focus!!'); 24 } 25}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

そもそもDOMをいじらないためにフレームワークを使っているので、Angularに適したアプローチに変えてください。

アプローチ例:

Typescript

1import { 2 Component, 3} from '@angular/core'; 4 5@Component({ 6 selector: 'app-root', 7 template: ` 8 <div id="hoge"> 9 <button (click)="addInput()">ADD</button> 10 <input type="text" (focus)="focusFunc()" *ngFor="let input of inputArray"> 11 </div> 12 `, 13}) 14 15export class AppComponent { 16 inputArray: boolean[]; 17 18 addInput() { 19 inputArray.push(true); 20 } 21 22 focusFunc() { 23 alert('focus!!'); 24 } 25}

投稿2017/11/28 01:57

編集2017/11/28 02:00
Everatch

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

動的にの意味あいにNgIfがあてはまる場合は、
以下の回答ではいかがでしょうか??
間違ってたらすいません。

TypeScript

1 2import { Component } from '@angular/core'; 3import { NgIf } from '@angular/common'; 4 5@Component({ 6 selector: 'app-root', 7 templateUrl: './app.component.html', 8 styleUrls: ['./app.component.css'] 9}) 10 11export class AppComponent { 12 private show : boolean = false; 13 14 private addInput():void{ 15 this.show = !this.show; 16 } 17 18 private focusFunc():void{ 19 alert('focus!'); 20 } 21 22} 23 24

app.component.html

1 2 <div class="hoge"> 3 <button (click)="addInput()">foo</button> 4 <div *ngIf="show"> 5 <input 6 type="text" 7 (focus)="focusFunc()" 8 > 9 </div> 10

投稿2017/09/20 10:27

編集2017/09/20 11:20
ngna

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizz

2017/09/20 11:02 編集

ご回答ありがとうございます。 1つお伺いしたいのですが、 <div *ngIf="show">...</div> の要素は動的に生成するのでしょうか?
wizz

2017/09/21 01:52

ご回答ありがとうございます。 私がやりたいと考えているのは、ngna様の仰る、 "clickのイベントでcreateElement( tagName )をし生成する" のやり方です。 説明がわかりにくくて申し訳ありません。 createElementで生成した要素に設定する方法をご存知でしたらご教授いただけないでしょうか?
guest

0

ベストアンサー

TypeScriptちょっとやったことないのでできるかわからないですけど、

addEventListenerを使ってみてはどうでしょう?

lang

1// 省略 2let elm = document.getElementById('hoge'); 3let inputElm = document.createElement('input'); 4 5inputElm.addEventListener('focus',focusFunc,false); 6 7elm.appendChild(inputElm); 8// 省略

投稿2017/09/20 08:55

編集2017/09/20 09:30
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizz

2017/09/20 09:43

ご回答ありがとうございます。 ご提案して頂いた方法を試してみましたが、 focusFuncは呼び出されませんでした... TypeScriptの場合は何か特別な処理が必要なのでしょうか...
namnium1125

2017/09/20 09:54

実はfocusイベントなのにも関わらずdivにイベントを足していたので慌てて(18:30に)コードを編集したのですが、現在のコードでもダメでしょうか?
wizz

2017/09/20 10:36

ご回答ありがとうございます。 変更後のコードを試したところ、動作しました! ありがとうございました!!
guest

0

focus時にalertだすとfocusが外れてしまいますがよろしいのでしょうか?
※動的な追加の部分も念の為かいておきます

javascript

1HTMLElement.prototype.focusFunc=function(){ 2 alert("fucus!"); 3} 4document.addEventListener('focus',function(e){ 5 var t=e.target; 6 if(t.nodeName=="INPUT" && t.type=="text"){ 7 t.focusFunc(); 8 } 9},true); 10document.addEventListener('click',function(e){ 11 var t=e.target; 12 if(t.nodeName=="INPUT" && t.type=="button" && t.value=="add"){ 13 var n=document.createElement('input'); 14 n.setAttribute("type","text"); 15 t.parentNode.appendChild(n); 16 } 17});

HTML

1<div> 2<input type="button" value="add"> 3</div> 4

投稿2017/09/20 08:57

編集2017/09/20 09:04
yambejp

総合スコア114837

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizz

2017/09/20 09:50

ご回答ありがとうございます。 HTMLElement.prototype.focusFunc...のところで ” Property 'focusFunc' does not exist on type 'HTMLElement'. ” というエラーがでてしまいました。 原因を調査しながら、もう少し調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問