いそべやきはビールの夢をみる

今日もしがないえんじにあ

【非同期通信実装備忘録①】preventDefaultで止めたイベントは止めっぱなしにしてはいけない。

TECH::EXPERTに通い始めてちょうど一ヶ月。初めてコネクトを利用し、メンターさんに質問をしました。筋道立てて話すのが苦手&途中で話が崩壊しそうだと思い笑、状況と質問したいことを事前に紙に書き出したのですが、頭が整理できていいなと思いました。今後もエラーが出た時は、ウンウン悩むだけでなく、紙に状況を書き出してみよう。

 

そしてエラーは一瞬で解決…

 

以下のようなチャットアプリを作成しており、

メッセージ送信機能の非同期通信の実装をしていました。

が!連続して投稿できない。

投稿後、また文字を入力して「send」ボタンをクリックしても何も起こらない…

 

非同期通信の処理に関して、jQueryでこのように書いていました(一部省略)。

 

$('#new_message').on('submit', function(e){
e.preventDefault();

…省略…

 $.ajax({
 非同期通信のオプションを定義
 })

 .done(function(data){

   …省略(非同期通信成功時の処理)…

 $('.text-message').val('')  // テキストの入力欄をリセット
   })
 .fail(function(){
 alert('error');
 })

});

 

エラーの原因

→preventDefault();でフォームのsubmitイベントを止めて非同期通信を行なっていたが、イベント再開の処理を記述していなかったため。

 

投稿後の「send」ボタンの状態を検証画面で確認してみると、「disabled」属性が付いていました。input要素が無効になってしまっています。

sendボタンのHTML情報

<input type="submit" name="commit" value="Send" class="chat-content__form-submit" data-disable-with="Send" disabled="">

 

解決法

→ .done(function(){  }内に、submitイベントを再開させるコードを書く。

 

.done(function(data){

   …省略(非同期通信成功時の処理)…

 $('.text-message').val('')  // テキストの入力欄をリセット

   $('.chat-content__form-submit').attr('disabled', false);    //追加!
   })

 

これで連続投稿ができるようになりました。投稿後の「send」ボタンを検証してみると…

<input type="submit" name="commit" value="Send" class="chat-content__form-submit" data-disable-with="Send">

「disabled」属性が付いていないことが確認できます。

 

つらつらと書いてきましたが、重要な学びは以下の2点です。

☆preventDefault();でイベントを中断させた場合、保存完了後の処理の中にイベントを再開させるコードを記述する。

☆エラーかな?と思ったら検証画面もよく確認する。自分がテキスト上に書いたコード以外の情報が分かる。

 

正確且つ見やすい、無駄のないコードを書くに至るには道のりは長いですが…千里の道も一歩から、頑張ります・・・。