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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

407閲覧

iPhoneからの画像の回転表示対策:JavaScript-Load-Image

taaa

総合スコア32

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2018/02/17 00:50

iPhoneで撮影された画像のアップロードで、htmlに表示するとき、画像が回転されてしまうエラーを解決したいと思っています

ライブラリJavaScript-Load-Imageを使い、

1)<img>のonloadで出力する画像のURLをfunction関数 fix_photoに渡して、
2)その内部でJavaScript-Load-Imageを利用してcanvasに回転修正したものを生成
3)それをjpgに変換して表示

という処理をしたいのですが、 (1)の時点で引っかかっています

javascript

1function fix_photo(imageUrl, tObj){ 2 console.log(imageUrl); 3  4 //以下のloadImage()処理が有効だと、なぜかループ処理される 5 loadImage( 6 imageUrl, 7 function (img) { 8 if(img.type === "error") { 9 console.log("Error loading image " + imageUrl); 10 } else { 11 jQuery(tObj).attr('src', imageUrl); 12 //document.body.appendChild(img); 13 } 14 }, 15 {maxWidth: 600} 16 ); 17}

html

1<img onload="javascript:fix_photo('http://domain/path/to/iphone.jpg', this)" src="http://domain/path/to/dummy.jpg"> 2<img onload="javascript:fix_photo('http://domain/path/to/iphone.jpg', this)" src="http://domain/path/to/dummy.jpg">

上記のような単純な処理で、
とりあえず対象の画像URLをfunction内に取り込めてるか console.log()で確認すると正常に表示されたのですが、
その後、「loadImage(~~);」を追記したところ、console.logが無限に繰り返されてブラウザがハングアップしてしまいました

何が原因でしょうか
ご意見ご回答よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

img要素のonloadイベントハンドラ内でsrcプロパティを弄っていれば, そりゃイベントループに陥ります.

無限ループの原理

  • 画像を読み込む
  • 画像の読み込みが完了しloadイベントが発生する
  • onloadイベントハンドラが呼び出され, fix_photo関数が呼び出される.
  • loadImageメソッドに渡しているコールバック関数内でjQuery(tObj).attr('src', imageUrl)を実行しているので, もとのimg要素のsrcプロパティが書き換わる
  • 一番上に戻る

JavaScript

1function fix_photo(imageUrl, tObj){ 2 console.log(imageUrl); 3  4 //以下のloadImage()処理が有効だと、なぜかループ処理される 5 loadImage( 6 imageUrl, 7 function (img) { 8 if(img.type === "error") { 9 console.log("Error loading image " + imageUrl); 10 } else { 11 jQuery(tObj).attr('src', imageUrl);//←ここでsrcをいじっているのでfix_photoが何度も呼び出される! 12 //document.body.appendChild(img); 13 } 14 }, 15 {maxWidth: 600} 16 ); 17} 18

で, どうすればこの問題を解決できるかというと, 上のループを断ち切れば良いのです. つまり, onloadイベントハンドラを無効化すれば処理は止まります.

JavaScript

1function fix_photo(imageUrl, tObj){ 2 console.log(imageUrl); 3  4 //以下のloadImage()処理が有効だと、なぜかループ処理される 5 loadImage( 6 imageUrl, 7 function (img) { 8 if(img.type === "error") { 9 console.log("Error loading image " + imageUrl); 10 } else { 11 tObj.removeAttribute("onload");//これでsrcを弄っても問題なくなった 12 jQuery(tObj).attr('src', imageUrl); 13 //document.body.appendChild(img); 14 } 15 }, 16 {maxWidth: 600} 17 ); 18} 19

NOTE:
ざっと見, onloadイベントを使っている意味がわからないので, もう少しコードを整理した方が良さそうです.

投稿2018/02/17 03:15

defghi1977

総合スコア4756

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

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

taaa

2018/02/17 06:40

ありがとうございました! 非常にお恥ずかしい、検証不足というかアホ丸出しでお手を煩わせました また何かありましたらよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問