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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1476閲覧

追加した要素にすでにあるイベントハンドラを再登録したい3

k499778

総合スコア599

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/04/28 17:10

現在HTML,Javascript(jQuery)を使ってアプリを作っています。

前回の投稿でアドバイスを頂き、自分なりに再登録の方法を模索しました。
追加した要素にすでにあるイベントハンドラを再登録したい2

結果以下のような形でやりたいことは実現できました。thisではなく、jQuery.Eventオブジェクトを使って。

HTML

1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>event.data demo</title> 6 <script src="https://code.jquery.com/jquery-1.10.2.js"></script> 7</head> 8<body> 9<span id="userfile_item"> 10 <input type="file"> 11</span> 12<button>クリア</button> 13<script> 14//ファイルアップロード時 15$('input').on('change',function(ev){ 16 log(ev); 17}); 18 19//ログを出力する関数 20function log(ev){ 21 console.log(ev.target.value); 22} 23 24//クリアボタン押下時 25$('button').on('click',function(){ 26 //IE10以前用にinputタグを再生成する 27 $('#userfile_item').html('<input type="file" name="userfile">'); 28 //イベントハンドラを再登録する 29 $('input').on('change',log); 30}); 31</script> 32</body> 33</html> 34

ただなぜうまくいっているかわからないので教えていただきたいです。
わからないのは、「ev」についてです。

ファイルアップロード時は、
$('input').on('change',function(ev){の「ev」がlog関数への引数として渡され、ログを出力しました。

しかしイベントハンドラ再登録時は、
$('input').on('change',log)で、log関数の引数は設定されておらず、log関数では、log関数のイベントオブジェクトとして「ev」が働いています。

またlog関数が独立的に動くならと,$('input').on('change',function(ev)内のlog関数の引数を取り除き
log();
としたのですが、こうするとevがundifinedとなり、うまく動きませんでした。

このように
$('input').on('change',function(ev)のときは,evが引数として渡され、
$('input').on('change',log);のときは引数として渡してなくとも,log関数内でevを使えている違いは何なのか
を教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

JavaScriptの無名関数が悪さというか、わかりにくさを出してしまっていますね、
まず、JavaScriptでは、関数の定義方法がいくつかありますが、今回はとりあえず2つ書きます。
こちらは、普通の関数。

JavaScript

1function log(ev){ console.log(ev.target.value); }

まったく同じ関数定義ですが、実は以下のようにも書けます、「無名関数」を「変数」に代入しています。

JavaScript

1var log = function(ev){ console.log(ev.target.value); }

これらを動作させるためには、いづれも、

JavaScript

1log(ev);

とするだけです。どちらも、まったく同じ動作をします。

これを踏まえて、先のコードを見ると(ちょっとわかりやすいよう?に書き換えました)、

JavaScript

1$('input').on('change', function(ev){console.log(ev.target.value);} );

このコードですが、実はevという変数云々という所では無く、$('input').on('change'の引数として、

JavaScript

1function(ev){console.log(ev.target.value);}

そのものを代入していると、見えてきませんでしょうか?ということは、先の「無名関数」に戻ると、

JavaScript

1var log = function(ev){console.log(ev.target.value);}

ですから、結果として、

JavaScript

1$('input').on('change',log);

と書けることとなります。

うーん、、、説明、難しいですが、何度も読み直していただければ、もしかしてご理解いただけるかも。

投稿2016/04/28 21:04

ItoTomonori

総合スコア1283

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

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

k499778

2016/04/29 05:20

回答ありがとうございます。 なんとなくわかってきた気がしました。 私は function log(ev){console.log(ev.target.value);} の「ev」をlog関数名の引数として捉えていましたが、 var log = function(ev){ console.log(ev.target.value); } とも書けるため、 また $('input').on('change',log); のlogは関数オブジェクトが入るため、 「log(ev)」ではなく、「log」となる。 そういった認識である程度合っているでしょうか? 何か致命的な間違いはないでしょうか? 関数オブジェクトに関してはまだまだ知識が薄いので誤認している場合もありますが、 これから勉強していきます。
guest

0

以前質問されていた 追加した要素にすでにあるイベントハンドラを再登録したい2 に私がした回答、およびそこにつけたコメントをご理解いただければ、この質問についても自己解決できるはずです。

と、突き放すだけもアレなので、ちょっとだけヒントを。

javascript

1var log2 = function (ev) { 2 log(ev); 3}

としたとき、log(ev)log2(ev) がほぼ同じ動きをすることはご理解いただけますか。

javascript

1function say(greeting) { 2 console.log(greeting); // (1) 3} 4``` のとき、`say(1.1)` と呼び出したら `(1)` のところで `greeting``1.1` になること、`say()` と呼び出したら `(1)` のところで `greeting``undefined` になることはご理解いただけますか。

投稿2016/04/28 17:24

unau

総合スコア2468

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

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

k499778

2016/04/30 08:30

回答ありがとうございます。 その双方に関しては理解できます。 もう少し自分でも勉強したいと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問