proguradk
@proguradk

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コードの解説をしてほしい

解決したいこと

railsでJSを用いて画像プレビューを実装しましたがコードが理解できません。
分かる方いましたら解説をお願いしたいです。
また、rubyでのJSが理解しやすいおすすめサイトもあれば紹介してほしいです。
よろしくお願いします。

該当するソースコード

$( document ).on('turbolinks:load', function() {
  function readURL(input) {
    if (input.files && input.files[0]) {
      var reader = new FileReader();

      reader.onload = function (e) {
        $('#avatar_img_prev').attr('src', e.target.result);
      }
      reader.readAsDataURL(input.files[0]);
    }
  }

  $("#post_img").change(function(){
    $('#avatar_img_prev').removeClass('d-none');
    $('.avatar_present_img').remove();
    readURL(this);
  });
});

参考サイト
https://remonote.jp/rails-image-preview-jquery

0

2Answer

// ----------------------------------------
// 全てはjavascriptです
// rubyは関係ありません
// 全てはサーバーではなくクライアントで動くスクリプトです
// ----------------------------------------

// これは無名関数の中に関数を宣言していたのを外に出しました
// 関数の中に宣言していれば、関数の中だけでしか呼べないのでグローバル環境を汚しません(同じ名前が衝突すると面倒だったり)
function readURL(input) {
  // <input type="file" ...
  // input fileオブジェクトはfilesを持つ
  // https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/file#attr-files
  // ファイルが1つだけでもあれば...
  if (input.files && input.files[0]) {
    // https://developer.mozilla.org/ja/docs/Web/API/FileReader
    var reader = new FileReader();

    // 表示できるデータが来たらこの無名関数を呼んでという設定
    // https://developer.mozilla.org/ja/docs/Web/API/FileReader/onload
    reader.onload = function (e) {
      // avatar_img_prevというIDの要素のsrcを変更してというjQueryの関数
      $("#avatar_img_prev").attr("src", e.target.result);
    };
    // https://developer.mozilla.org/ja/docs/Web/API/FileReader/readAsDataURL
    // これを呼ぶと、読み込みが完了した時点で上の.onloadに設定した関数が走る
    reader.readAsDataURL(input.files[0]);
  }
}

// これも無名関数だったのであえて切り出した(今回のような場合、普通はやらない)
function onFileChange() {
  // avatar_img_prevというIDの要素からd-noneというcssクラスを取り除く
  $("#avatar_img_prev").removeClass("d-none");
  // avatar_present_imgというcssクラスがある要素を全て取り除く
  $(".avatar_present_img").remove();
  // ここのthisはpost_imgというIDのある要素(ここではinput type="file"のハズ)
  // this = post_img要素であるのは.changeにこの関数を渡しているので...
  // https://www.google.com/search?q=javascript+this+scope&oq=javascript+this+scope&aqs=chrome..69i57j0i30l5j0i8i30l4.4007j1j7&sourceid=chrome&ie=UTF-8
  readURL(this); // 上で宣言した関数
}

// function(){}は無名関数です(書き捨てのfunctionが要る時に使います - 二度と同じ関数を呼ぶことがない場合など)
// 普通の関数にしたらこういう風になります
function turboLinkOnLoad() {
  // $()はjQueryです
  // jQueryはjavascriptのライブラリです
  // https://jquery.com/
  // post_imgというIDのある要素が変更されたらonFileChangeを実行
  // onFileChange()
  // ではなくて
  // onFileChange
  // こうすることで関数のオブジェクトを渡せ、.changeが実行してくれる
  // onFileChange()
  // だと関数の実行結果を渡すことになる
  $("#post_img").change(onFileChange);
}

// "turbolinks:load"はRailsのturbolinksが独自に作ったイベントです
// turbolinksが実行可能状態になったら、この関数を呼んでねとdocumentに登録している
$(document).on("turbolinks:load", turboLinkOnLoad);
1Like

rubyでのJS

というものはありません。
サーバーはただ単にその他のhtml等と同様に文字としてjavascriptをクライアントに送っているだけです。

Javascript チュートリアル 入門レベル

学習サイトは使ったことがありませんが、javascriptは何もインストールしなくてもブラウザで動いているので、デベロッパーツールを開いてコンソールから入力して動作を確認するのは直感的に分かりやすいと思います。

1Like

Your answer might help someone💌