以前良く似た質問をしましたが、また疑問点が出たので質問します。
前回は、以下のコードでなぜonload = funcで動作し、onload = func()では動作しないのかをお聞きしました。
var img = new Image();
window.onload = function() {
img.onload = func;
}
function func() {
(省略)
}
その結果、funcだと関数を指定し、func()だと関数の返り値を代入するという答えを頂きました。
しかし自分で実験してみたところ、以下のコードでは逆の結果になりました。
window.onload = function() {
document.getElementById("result1").onload = result1;
document.getElementById("result2").onload = result2();
}
function result1() {
document.getElementById("result1").innerHTML = "result1";
}
function result2() {
document.getElementById("result2").innerHTML = "result2";
}
<div id="result1"></div>
<div id="result2"></div>
onload = result2()の方は期待通りの結果が得られましたが、onload = result1ではdiv要素に文字列は挿入されませんでした。onloadによって実行される関数をfunc形式で指定したのになぜ動作せず、func()形式のもののみ動作したのでしょうか?
あと蛇足になりますが、このようなコードも試してみましたが、どちらもうまくいきませんでした。
window.onload = function() {
document.getElementById("result1").onload = result1;
document.getElementById("result2").onload = result2();
}
function result1() {
this.innerHTML = "result1";
}
function result2() {
this.innerHTML = "result2";
}
<div id="result1"></div>
<div id="result2"></div>
両方のfunction内のthisはdocument.getElementById("result1")またはdocument.getElementById("result2")を指すのではないのでしょうか?
No.4ベストアンサー
- 回答日時:
function func(){
alert('func');
}
これは、funcという名前の関数を「定義」するものです。
そして
func();
と書くと、これはfuncという名前の関数を「実行」します。
ですが、
func
だけでしたら、それは関数を実行するのではなく、「funcという名前の関数を意味する」ということになります。
----------
window.onloadというのは、
windowに対してloadというイベントが発生したときにonloadに指定された関数が実行されます。
----------
window.onload=func;とするとfuncという名前の関数がwindowのloadイベントと同時に「実行」されます。
window.onload=func();とすると
func()はその場で実行して、その戻り値がonloadに入れられます。
(funcにはreturnが明示的に書かれていませんので、undefinedになります)
windowのloadイベントと同時にonloadに入れられたundefinedを「実行」しようとしますが、undefinedは実行できませんから、結局何もしません。
---------------
> function result1() {
> document.getElementById("result1").innerHTML = "result1";
> }
> function result2() {
> document.getElementById("result2").innerHTML = "result2";
> }
この2つの関数は、idがresult1、result2のエレメントのinnerHTMLを書き換える関数を「定義」しているものです。
> window.onload = function() {
> }
これは関数の定義とonloadへの代入を同時にやってるだけですので、説明は不用だと思います。
これによりwindowのloadイベントでこの関数の中身が実行されます。
> window.onload = function() {
> document.getElementById("result1").onload = result1;
> document.getElementById("result2").onload = result2();
> }
2行目のresult2から説明します。
> document.getElementById("result2").onload = result2();
かっこが付いているので、result2という関数を「実行」し、その戻り値をdocument.getElementById("result2")のonloadに代入します。
このときに実行していますから、innerHTMLの書き換えが完了しています。
result2という関数は戻り値はundefinedですから、
document.getElementById("result2")のloadイベントでは何もしないことになります。
1行目、
> document.getElementById("result1").onload = result1;
window.onloadの件で説明した様に、document.getElementById("result1")のloadイベントの時にresult1を実行しなさいと言う指示です。
そこで問題になるのがloadイベントの発生がいつ起きるのか、ということですが、
divエレメントはloadイベントを発生させません。
ですから、いつまで経ってもresult1という関数は実行されないままになります。
(2行目の方もundefinedを代入していますが、実は、それを実行しようともしません)
<img>を使う場合などでも、読み込み完了後(loadイベント発生後)に
onloadを指定しても、すでにloadが完了していますから、それ以上関数が呼び出されることはありません。
window.onloadが早いか、img.onloadが早いからそのときの状況次第でかわります。
onloadに代入するときは、loadイベントが発生する前か後かも注意してください。
---------------
> function result1() {
> this.innerHTML = "result1";
> }
このときのthisはwindowになります。
window.innerHTMLに何かを入れても、通常は目に見える変化はありません。
No.3
- 回答日時:
やるならこう
<script>
window.onload = function() {
result1();
document.getElementById("result2").func=result2;
document.getElementById("result2").func();
}
function result1() {
document.getElementById("result1").innerHTML = "result1";
}
function result2() {
this.innerHTML = "result2";
}
</script>
<div id="result1">test</div>
<div id="result2">test</div>
resulut1()関数を呼ぶか、オブジェクトにメソッドを設定してから
実行する。
No.1
- 回答日時:
document.getElementById("result1").onload = result1
≒
<div id="result1" onload="result1()"></div>
って意味がないですよね。
(onloadイベントが発生するのって他のリソースを読み込むimgやiframe以外だとページそのものを示すbody(window)だけです。)
イベントが発生しないのでresult1が実行される事もありません。
document.getElementById("result2").onload = result2();
は、()付きですからdivのonloadではなくwindow.onloadでこの行が実行されるときにresult2が実行されます。
function内でのthisについてはよくわかっていないのでパス。
少なくともocument.getElementById("result1")等ではありません。
<input onclick="result1(this)">
などど書くと呼び出したobjectを渡せますが、関数内でthisと書いても呼び出し元のobjectが得られるわけではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DOM要素を削除しても、イベント...
-
Latexに関する質問です。
-
なぜfunc()で動き、funcで動か...
-
FireFoxのjavascriptで自動でキ...
-
Null またはオブジェクトではあ...
-
WSHのIEオブジェクト操作後のク...
-
選択によってsubmitボタンの色...
-
iframe内のページ(複数)を変更
-
javascriptの基本的なことだと...
-
google apps scriptの終了のさせ方
-
同じIDで定義した要素の配列を...
-
C#で、ContextMenuStripに動的...
-
confirmの連続?
-
jspからjavascriptの変数引継ぎ
-
ActiveXobjectが作成できない
-
GASでundefinedエラーが出ます
-
JavaScriptで文字列の特定文字...
-
【正規表現】【javascript】CR...
-
-(ハイフン)_(アンダーバー)の...
-
Excel VBA の ChangeFileAccess
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Latexに関する質問です。
-
TexでΣの添え字の位置直し
-
excle VBA とweb上の検索を利用...
-
Null またはオブジェクトではあ...
-
DOM要素を削除しても、イベント...
-
webページ上のTabキーの動き
-
JavaScript window.openで開く...
-
FireFoxのjavascriptで自動でキ...
-
onClickイベントの変更方法
-
LaTeX:数式を等号揃えにする方法
-
Javascriptで定期的にF5を押す...
-
javascriptの基本的なことだと...
-
VBAでIEのボタンを押してメッセ...
-
showModalDialogで開いた画面を...
-
VBAのIE操作でframe構造のサイ...
-
XMLでのAttributeを持ったNode...
-
選択によってsubmitボタンの色...
-
compatModeとは?
-
重い処理とはどのようなものが...
-
クリッカブルマップのリンク部...
おすすめ情報