解決のアイディアをお持ちの方、ぜひご教授ください。よろしくお願いします。
前提・実装したいこと
Ruby on Railsの中で、javascriptを使って、範囲指定して印刷する機能を実装したい。
発生している問題・エラーメッセージ
印刷ボタンを押しても、印刷が実行されない。(何も起きません)
検証ツールでconsoleを確認したら、以下のエラーがありました。
console
1Uncaught TypeError: Cannot read property 'add' of undefined
分かっていること
範囲指定をしない印刷(表示されている全体の印刷)は実行できました。
javascriptで扱うid,class等は取得できていて、印刷以外の機能は動いています。
自分で調べたこと
contents.javascript
内の変数hide
の値がnullになっているので、
スタイルシートの.hide
が取得できていないのが原因だ、というところまではわかりました。
この.hide
は、現時点でビュー上で使われておらず、スタイルシート内にあるだけです。
やってみたこと
####1.
app/views/layouts/application.html.haml
に以下の記述を追加
= stylesheet_link_tag 'print', media: 'print', 'data-turbolinks-track': 'reload'
app/assets/stylesheets/print.scss
を追加(下記コードを参照ください)
結果:うまくいきませんでした。
####2.
app/assets/stylesheets/modules/_contents.scss
に、以下の記述を追加(片方ずつ試しました)
@media print{ .hide { display: none; } }
.hide { display: none; }
結果:どちらもうまくいきませんでした。
今回の問題に関係あると思われるコード
haml
1-# app/views/layouts/application.html.haml 2!!! 3%html 4 %head 5 %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/ 6 %title Teacher's Bar 7 = csrf_meta_tags 8 = csp_meta_tag 9 10 11 -# スタイルシートの参照先 12 = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' 13 14 -# 自分で検索して、入れてみた部分(記述しても問題解決せず) 15 = stylesheet_link_tag 'print', media: 'print', 'data-turbolinks-track': 'reload' 16 17 18 = javascript_include_tag 'application' 19 %body 20 21 = yield
scss
1// app/assets/stylesheets/print.scss 2 3 .hide { 4 display: none; 5 } 6
javascript
1// app/assets/javascripts/contents.js 2 3// (抜粋) 4// 印刷範囲を指定して、印刷を実行するコード 5window.addEventListener("load", function () { 6 let printBtn = document.getElementById("print"); 7 printBtn.addEventListener("click", function() { 8 let hideRange = document.querySelectorAll(".leftSide, .header"); 9 let hide = document.querySelector(".hide"); //← mix-peachさん、ありがとうございます! 10 11 console.log(hide); // ←この部分で、hideの値がnull 12 hideRange.classList.add(hide); // ←この部分で、エラーが出る。 13 window.print(); 14 hideRange.classList.remove(hide); 15 });