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

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

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

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

jQuery

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

Q&A

解決済

2回答

2187閲覧

jQueryの無名関数に2つめの引数が渡らない

alberorana

総合スコア52

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/03/05 03:26

前提・実現したいこと

jQueryを用いて、音声ファイルが読み込まれたらとある処理を行う事になります。

発生している問題・エラーメッセージ

undefind

該当のソースコード

for (i=0; i<10; i++) { audio[i] = document.getElementById(audioMore[i]); var hiki = document.getElementById(audioMore[i]); var area = json[i].id; console.log(area); audio[i].addEventListener('loadedmetadata',function(hiki, area) { console.log(area); var minute = Math.floor(hiki.srcElement.duration/60); minute = ( '00' + minute ).slice( -2 ); // 先頭に0を足してから2桁に整形 var sec = Math.floor(hiki.srcElement.duration%60); sec = ( '00' + sec ).slice( -2 ); $(area).text(minute + ':' + sec); }); }

4行目の area にはちゃんと数値が入るのですが、 audio[i].addEventListener('loadedmetadata',function(hiki, area) { 内のコンソールログでは undefind になってしまいます。
スコープ関連か何かと思ったのですがうまくいきません。

試したこと

引数を文字列を変更してみたり、直接文字列を入れたりしてみましたが、うまくいきませんでした。
回答が思いつく方、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

addEventListenerで登録した匿名関数(リスナ関数)を呼び出しているのはあなたではありません.

WEBブラウザがloadedmetadataイベントの発生を元に非同期的にリスナ関数を呼び出しているのであり, その際の第一引数にEventオブジェクトを渡すことになっているのです.

つまり, リスナ関数の引数(hiki,area等)に勝手に意味付けをすることは出来ません.

ですが, リスナ関数に対しbindメソッドを用いると**関数を束縛する(パラメータが固定された関数を生成する)**ことが可能です. 従って, 次のようにすればリスナ関数に自由にパラメータを渡すことが可能となります.

JavaScript

1for (i=0; i<10; i++) 2{ 3 audio[i] = document.getElementById(audioMore[i]); 4 var hiki = document.getElementById(audioMore[i]); 5 var area = json[i].id; 6 console.log(area); 7 audio[i].addEventListener('loadedmetadata',function(hiki, area, e) {// 8 console.log(area); 9 var minute = Math.floor(hiki.srcElement.duration/60); 10 minute = ( '00' + minute ).slice( -2 ); // 先頭に0を足してから2桁に整形 11 var sec = Math.floor(hiki.srcElement.duration%60); 12 sec = ( '00' + sec ).slice( -2 ); 13 $(area).text(minute + ':' + sec); 14 }.bind(null, hiki, area));//関数を束縛する(パラメータ設定済みの関数を生成する) 15} 16

参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

投稿2018/03/05 04:14

defghi1977

総合スコア4756

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

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

alberorana

2018/03/05 04:43

代替手段のご教授ありがとうございました! この方法で実現でき、感謝申し上げます。
defghi1977

2018/03/05 04:47

> スコープ関連か何かと思ったのですがうまくいきません。 実際にはこの部分も絡んでいて, bindを使うことで一度に二つの問題が解決している処に注意して下さい.
guest

0

addEventListenerですから引数はイベント1つだけでは?

投稿2018/03/05 03:32

yambejp

総合スコア114843

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

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

alberorana

2018/03/05 03:40

さっそくのご回答ありがとうございます。 おっしゃる通り渡せる引数は1つだけのようでした > <
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問