LoginSignup
0
0

More than 3 years have passed since last update.

ChatSpaceの JavaScript復習

Last updated at Posted at 2020-05-14

はじめに

TECH:CAMPのカリキュラムで作ったチャットスペースのJavaScript非同期通信の自分なりの理解です。htmlは自分で考えたhamlの記述になっているのでご了承ください。
理解が間違っていたらすみません。

コード解説


$(function(){
    var buildHTML = function (message) {
      if (message.content && message.image) {
        var html =`<div class="chat-main__chat-home__message" data-message-id="${message.id}">
                    <div class="chat-main__chat-home__message__block">
                      <div class="chat-main__chat-home__message__block__current-user">
                        ${message.user_name}
                    </div>
                      <div class="chat-main__chat-home__message__block__current-user-date">
                        ${message.created_at}
                      </div>
                    </div>
                      <div class="chat-main__chat-home__message__current-text">
                        <p class="chat-main__chat-home__message__current-text__content">
                        ${message.content}
                        </p>
                        <img src=${message.image} class="chat-main__chat-home__message__current-text__image" >  
                      </div>
                    </div>`
      } else if (message.content) {
        var html =`<div class="chat-main__chat-home__message" data-message-id="${message.id}">
                    <div class="chat-main__chat-home__message__block">
                       <div class="chat-main__chat-home__message__block__current-user">
                        ${message.user_name}
                  </div>
                    <div class="chat-main__chat-home__message__block__current-user-date">
                        ${message.created_at}
                    </div>
                  </div>
                    <div class="chat-main__chat-home__message__current-text">
                      <p class="chat-main__chat-home__message__current-text__content">
                        ${message.content}
                      </p>
                  </div>
                </div>`
      }else if(message.image) {
        var html =`<div class="chat-main__chat-home__message" data-message-id="${message.id}">
                     <div class="chat-main__chat-home__message__block">
                       <div class="chat-main__chat-home__message__block__current-user">
                        ${message.user_name}
                    </div>
                    <div class="chat-main__chat-home__message__block__current-user-date">
                        ${message.created_at}
                    </div>
                  </div>
                    <div class="chat-main__chat-home__message__current-text">
                    <img src=${message.image} class="chat-main__chat-home__message__current-text__image" >  
                  </div>
                </div>`
        };
      return html;
    };
$('#new_message').on('submit', function(e){
  // デフォルトのイベント停止
    e.preventDefault();
    // #new_messageというidがついたフォームの情報を取得
    var formData = new FormData(this);
    // 送信先であるthisのaction属性を取得
    var url = $(this).attr('action')
    $.ajax({
      //action属性のurlがそのまま入る
      url: url,
      // 投稿だからHttpメソッドはpost
      type: "POST",
      data: formData,
      dataType: 'json',
      //下記2つはformDataを使っている場合、falseにする
      processData: false,
      contentType: false
    })
    // 通信に成功した時、引数にformに入力した情報の入ったdataを受け取る
     .done(function(data){
      //dataを変数htmlに代入
       var html = buildHTML(data);
       //メッセージの表示される箇所に付加する
       $('.chat-main__chat-home').append(html);
       //自動でスクロールするアニメーションを付加する
       $('.chat-main__chat-home').animate({ scrollTop: $('.chat-main__chat-home')[0].scrollHeight});
       //入力フォームの中をリセットする
       $('form')[0].reset();
       //ボタンを再利用できる様にする
       $('input').prop('disabled', false);
    })
    // 失敗したとき
     .fail(function() {
      //  アラートで失敗したことを伝える
      alert("メッセージ送信に失敗しました");
      //ボタンを再利用できる様にする
      $('input').prop('disabled', false);
    });
  });

    // 自動更新機能
    var reloadMessages = function() {
      //_message.html.hamlにカスタムデータ属性で付与したidを取得している
      var last_message_id = $('.chat-main__chat-home__message:last').data("message-id");
      $.ajax({
        //ルーティングで設定した/groups/id番号/api/messagesとなるよう文字列を書く
        url: "api/messages",
        //表示なのGET
        type: 'GET',
        dataType: 'json',
        data: {id: last_message_id}
      })

      .done(function(messages) {
        //メッセージが0文字ではないとき
        if (messages.length !== 0) {
          // 空の変数を作成
          var insertHTML = '';
          //配列messagesの中身一つ一つを取り出し、HTMLに変換したものを空の変数に足し合わせる
          $.each(messages, function(i, message) {
            insertHTML += buildHTML(message)
          });
          // HTMLに追加
          $('.chat-main__chat-home').append(insertHTML);
          // スクロールアニメーション
          $('.chat-main__chat-home').animate({ scrollTop: $('.chat-main__chat-home')[0].scrollHeight});
        }
      })
      .fail(function() {
        alert('error');
      });
    };
    // 現在のURLが一致する場合
  if (document.location.href.match(/\/groups\/\d+\/messages/)) {
    //7秒ごとに更新
    setInterval(reloadMessages, 7000);
  }
});

最後に

JavaScriptは教室で詳しく教えてもらうことができなかったので、まだまだ理解が曖昧です。
これを素人に書けと言われても、コピペせざるを得ないと思ってしまいます。
しかし、コールバック関数、非同期通信、apiの作成と取得、カスタムデータ属性、そして多くのメソッドなど、JavaScriptのたくさんの機能が盛り込まれているので、一つずつ紐解きながら理解を深めていきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0