【Ruby on Rails】javaScriptのclickイベントが発火しないのはturbolinksのせいだった

バックエンド

「商品カートに追加する」ボタンがときどき無反応になる謎現象が起きました。
発生条件は、キャッシュをクリアしたあと問題のページに遷移した直後に発生。2回目以降のアクセス時には発生しない。
何やらコンソールエラーも出ていました。

Uncaught TypeError: Cannot read property 'replace' of undefined

こちらのエラーの発生箇所を見ると、フレームワークの深層部分のようなところに行き着き、全然わからない……。

環境

Ruby 2.4
Rails 5.0

ボタンの実装

ボタンはaタグで実装されており、javaScriptのclickイベントでカートへの追加処理をしていました。ボタン押下後は商品件数の表示を増やすだけでページ遷移はありません。

<a class="btn">商品カートに追加!</a>
$('.btn').click(function() {
  // カートに追加する処理
});

原因はturbolinks?

原因はturbolinksでした。rails初学者の私はナニソレ状態だったのですが、大先輩が教えてくれました。
turbolinksは、リンクする時にページ遷移せずにjsを利用してbodyの書き換えを行い、速く表示されるように見せかける技術だそうで。これを使っているとjsの問題は起きやすいそうです。
turbolinksはaタグのhrefを監視してhrefの書き換えを行います。しかし今回のボタンは、aタグですがページ遷移しないのでhrefがありませんでした。そのためにturbolinksがhrefのreplaceができないというjsのコンソールエラーになっていたわけですね。

対策はaタグをやめる

対策は簡単で、aタグをやめてdivにしました。これで即解決。でもマークアップ的にはページ遷移のないクリッカブルな要素はbuttonタグが最適です。しかし、buttonタグはブラウザデフォルトのスタイルが強く、リセットCSSが面倒だったので、divにしておきました。

そもそも

turbolinksはオフにした方がいろいろ安心かも。あとページ遷移ない時はaタグ使わないこと。

タイトルとURLをコピーしました