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

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

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

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

Q&A

解決済

3回答

268閲覧

if構文でブロック内の2行目のコードだけ実行される

yuki_90453

総合スコア326

JavaScript

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

0グッド

0クリップ

投稿2017/10/30 23:21

編集2017/10/30 23:43

下記のコードにおいてif構文内において「document.getElementById("iframe-contents").style.height = e.data + "px";」を実行させたいのですが、「 console.log("aaa")」を記述を入れると正常に動作します。
しかし、この記述を消すと動作しません。

###上手く動作するコード

window.addEventListener("message", receiveSize, false); function receiveSize(e) { if (e.origin === "https://file003.shop-pro.jp/") console.log("aaa") document.getElementById("iframe-contents").style.height = e.data + "px"; }

「document.getElementById("iframe-contents").style.height = e.data + "px";」は動作しますが、console.logは動作しません。

###動作しないコード

window.addEventListener("message", receiveSize, false); function receiveSize(e) { if (e.origin === "https://file003.shop-pro.jp/") document.getElementById("iframe-contents").style.height = e.data + "px"; }

色々試してみたのですが、原因が全くわかりません。アドバイスお願い致します。

###追記
ifのブロック内で2行目だけ実行されているようです。。。
下記の文だと1行目がスキップされ2行目だけ実行されています。

if (e.origin === "https://file003.shop-pro.jp/") console.log("aaa") document.getElementById("iframe-contents").style.height = e.data + "px"; if (e.origin === "https://file003.shop-pro.jp/") document.getElementById("iframe-contents").style.height = e.data + "px"; console.log("aaa")

1行目と2行目を入れ替えると2行目の「console.log("aaa")」正常に動作します、

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

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

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

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

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

guest

回答3

0

解決した後ですが、質問の主旨、発言からifの条件以外にもifの書き方で知識としての問題があるように思えます。

ifのブロック内で2行目だけ実行されているようです。。。

違うんです。あなたのifの書き方では、ifの結果がfalseだから1行目が実行されず、2行目はそもそもifの外なんだから絶対実行されるんです。

解説

JavaScript

1var check = false; 2if(check) 3 console.log("checkがtrueのときの処理1"); 4 console.log("checkがtrueのときの処理2"); 5console.log("共通処理");

さて、checkがfalseなので「checkがtrueのときの処理1、2」は処理されないはずです。では実際に動かすとどんな出力が出るでしょう?正解は以下のとおりです。

checkがtrueのときの処理2
共通処理

checkがfalseなのに「checkがtrueのときの処理2」だけ走ってしまっています。なんででしょう?それはifの{}を省略して、ifが**「省略if(1行if)」という扱いに変わっているからです。{}を書かずにifを書いた場合、「直後の1つの処理だけ」**しか判定の影響を受けません。インデントを揃えていても関係ありません。以下の処理は同じことなのです。

JavaScript

1if(check) 2 console.log("checkがtrueのときの処理1"); 3 console.log("checkがtrueのときの処理2"); // ifの影響を受けない

JavaScript

1if(check) { 2 console.log("checkがtrueのときの処理1"); 3} 4console.log("checkがtrueのときの処理2"); // ifの影響を受けない

私は「省略if」の存在を許せないタイプです。なぜなら「うっかり処理を挟むと意図しない動作になるから」です。例えば元々以下のコードで正しく動いていたコードがあったとします。

JavaScript

1if(check) 2 console.log("checkがtrueのときの処理1"); 3console.log("共通処理");

しかし、後日「あ、そうだcheckがtrueのときは事前にもう1個処理が必要だわ」となったとき、こう加えたとします。

JavaScript

1if(check) 2 console.log("checkがtrueのときの処理0"); 3 console.log("checkがtrueのときの処理1"); 4console.log("共通処理");

そして、checkをtrueにして動作テストしてみたところちゃんと処理0が実行されたのを見て満足します。すると、後日「checkがfalseなのに処理1が走ってるんだけどどうなってんの?」とバグ報告が上がります。1行ifを使っていると「ふとした拍子に処理を追加したときにバグを埋め込む可能性がある」ということです。しかし、ちゃんとブロックで囲っていればこんな事故は起きません。
たった2文字のタイピングをケチるためにこのようなバグを埋め込みかねないコード、私は親の敵ぐらい嫌いです。ちなみに1行forを書くことも同じことなので嫌いです。

投稿2017/10/31 00:44

編集2017/10/31 01:05
masaya_ohashi

総合スコア9206

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

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

masaya_ohashi

2017/10/31 00:45

おんなじこと書いてたー…遅かったー…
guest

0

if構文の記述に問題があるからです.

JavaScript

1function receiveSize(e) { 2 if (e.origin === "https://file003.shop-pro.jp/") 3 console.log("aaa")//A 4 document.getElementById("iframe-contents").style.height = e.data + "px";//B 5}

ではif文の後に{}を記述していないことから条件分岐の影響下にあるコードはAの行のみになります. 言い換えると次のコードと同等ということになります.

JavaScript

1//書き換えたコード 2function receiveSize(e) { 3 if (e.origin === "https://file003.shop-pro.jp/"){ 4 console.log("aaa")//A 5 } 6 document.getElementById("iframe-contents").style.height = e.data + "px";//B 7}

一方Aの行を削除した場合に得られたコード

JavaScript

1function receiveSize(e) { 2 if (e.origin === "https://file003.shop-pro.jp/") 3 document.getElementById("iframe-contents").style.height = e.data + "px";//B 4}

は次のコードと同等になります.

JavaScript

1//書き換えたコード 2function receiveSize(e) { 3 if (e.origin === "https://file003.shop-pro.jp/"){ 4 document.getElementById("iframe-contents").style.height = e.data + "px";//B 5 } 6}

ご覧の通り, if文の影響下にあるコードが全く異なりますから, 動作が変化するのは当然です.

投稿2017/10/31 00:29

defghi1977

総合スコア4756

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

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

0

ベストアンサー

単純にif文に入っていないということではないですか?
e.originの中身を確認してみてはいかがでしょう。

投稿2017/10/30 23:35

yuki-saito

総合スコア928

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

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

yuki_90453

2017/10/30 23:41

コンソールログで中身を確認しましたが、正常に入っています。 試してわかったのですが下記の構文だと2行目だけ実行されているようです。。。 下記の文だと1行目がスキップされ2行目だけ実行されています。 if (e.origin === "https://file003.shop-pro.jp/") console.log("aaa") document.getElementById("iframe-contents").style.height = e.data + "px"; if (e.origin === "https://file003.shop-pro.jp/") document.getElementById("iframe-contents").style.height = e.data + "px"; console.log("aaa") 1行目と2行目を入れ替えると2行目の「console.log("aaa")」正常に動作します、
yuki-saito

2017/10/30 23:51 編集

事象としてはif文に入っていないことを表しています。 if文に{}を付けたらどちらも動作しなくなるのではないですか? if (e.origin === "https://file003.shop-pro.jp/") { console.log("aaa") document.getElementById("iframe-contents").style.height = e.data + "px"; } e.originの値は本当に"https://file003.shop-pro.jp/"と完全一致ですか?
yuki_90453

2017/10/30 23:57 編集

はい、そうなんです。{}をつけると動作しなくなります。 e. originの値がhttps://file003.shop-pro.jp if文の値をhttps://file003.shop-pro.jp/ にしていました。"/"が原因で完全一致にハネられていたみたいです。 お騒がせ致しました。
yuki-saito

2017/10/31 00:00

解決したようでよかったです^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問