質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1595閲覧

Ajax通信を利用した画面表示の切り替え

NodaYudai

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/06/27 04:25

ここに質問の内容を詳しく書いてください。
JavaでWebアプリケーションを作成しています。
その中で、Ajax通信を用いてタスクの完了・未完了を切り替えデータベースの値もtrue/falseで切り替えられるようにしたいです。

発生している問題・エラーメッセージ

Uncaught TypeError: Cannot read property 'attributes' of null
が発生しています。

該当のソースコード

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" 4 layout:decorate="~{layout/layout}"> 5<head> 6<script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 7<meta charset="UTF-8"></meta> 8<meta name="_csrf" th:content="${_csrf.token}" /> 9<meta name="_csrf_header" th:content="${_csrf.headerName}" /> 10<title>WorshipList</title> 11</head> 12<body> 13<div layout:fragment="content"> 14 <!-- コンテンツ部分 --> 15 <div th:fragment="worshipList_contents"> 16 <div class="page-header"> 17 <h1>お参り一覧</h1> 18 </div> 19 <table class="table table-bordered table-hover table-striped"> 20 <tr> 21 <th class="info col-sm-2" th:text="#{supporterName}">檀徒氏名</th> 22 <th class="info col-sm-2" th:text="#{worship}">お参り</th> 23 <th class="info col-sm-2" th:text="#{schedule}">日時</th> 24 <th class="info col-sm-2" th:text="#{remark}">備考</th> 25 <th class="info col-sm-2" th:text="#{done}">完了チェック</th> 26 </tr> 27 <tr th:each="worship : ${worshipList}" th:object="${worship}"> 28 <td th:text="*{supporterName}"></td> 29 <td th:text="*{worshipOpts.label}"></td> 30 <td th:text="*{schedule}"></td> 31 <td th:text="*{remark}"></td> 32 <td> 33 <button class="btn btn-warning" 34 th:style="'display:' + (${worship.progress} ? 'none' : '')" 35 th:onclick="|complete(this, '*{worshipId}',true)|" 36 th:text="#{incomplete}">未完了</button> 37 <button class="btn btn-secondary" 38 th:style="'display:' + (${worship.progress} ? '' : 'none')" 39 th:onclick="|complete(this, '*{worshipId}',false)|" 40 th:text="#{complete}">完了</button> 41 </td> 42 </tr> 43 </table> 44 45 <script type="text/javascript"> 46 console.log( document.querySelector("meta[name='_csrf']") ) 47 console.log( document.querySelector("meta[name='_csrf']").attributes['content'] ) 48 console.log( document.querySelector("meta[name='_csrf']").attributes['content'].value ) 49 var complete = function(element, worshipId, doComplete) { 50 const token = document.querySelector("meta[name='_csrf']").attributes['content'].value; 51 const header = document.querySelector( 52 "meta[name='_csrf_header']").attributes['content'].value; 53  const bgColor = document.getElementById(worshipId); 54 let url = doComplete ? "/complete" : "/incomplete"; 55 fetch(url, { 56 method: 'POST', 57 headers: { 58 "Content-Type": 'application/x-www-form-urlencoded', 59 [header]: token 60 }, 61 body: `worshipId=${worshipId}` 62 }).then( 63 response => { 64 if (doComplete) { 65 element.style.display = 'none'; 66 element.nextElementSibling.style.display = ''; 67 } else { 68 element.style.display = 'none'; 69 element.previousElementSibling.style.display = ''; 70 } 71 } 72 ); 73 } 74 75 </script> 76 </div> 77</div> 78</body> 79</html>

疑問

metaタグで指定したth:contentの中身がattributesの['content']に相当するものだと理解していますが、
なぜnullが返されるのか?

試したこと

console.logによるデバッグ
コンソールに上記のエラー以外表示されていませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/06/27 05:35

ブラウザに出力されたHTMLコードはどうなってますか?
NodaYudai

2020/06/27 05:39

```HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"></meta> <!-- Bootstrapの設定 --> <link href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" rel="stylesheet"></link> <script src="/webjars/jquery/1.11.1/jquery.min.js"></script> <script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script> <!-- CSSの読込 --> <link href="/css/home.css" rel="stylesheet"></link> <title>Home</title> </head> <body> <!-- ===== ヘッダー(ナビゲーションバー) ===== --> <nav class="navbar navbar-inverse navbar-fixed-top" style="background-color:#007bbb;"> <div class="container-fluid"> <div class="navbar-header"> <div class="navbar-brand">寺務管理アプリケーション</div> </div> <form method="post" action="/logout"><input type="hidden" name="_csrf" value="f3e744f6-424e-47dd-b650-33e3bccaec1a"/> <button class="btn btn-link pull-right navbar-brand" type="submit"> ログアウト </button> </form> </div> </nav> <!-- ===== サイドバー ===== --> <div class="container-fluid"> <div class="row"> <div class="col-sm-2 sidebar"> <ul class="nav nav-pills nav-stacked"> <li role="presentation"> <a href="/supporterList">檀徒一覧</a> </li> <li role="presentation"> <a href="/supporterInsert">檀徒情報登録</a> </li> <li role="presentation"> <a href="/schedule">お参り一覧</a> </li> </ul> </div> </div> </div> <!-- ===== コンテンツ ===== --> <div class="container-fluid"> <div class="row"> <div class="col-sm-10 col-sm-offset-2 main"> <!-- template画面で必要 th:include="<ファイルパス名> :: <th:fragment属性の値>” 動的ページを表示させるには、プリプロセッシングを使う--> <div> <div class="page-header"> <h1>お参り一覧</h1> </div> <table class="table table-bordered table-hover table-striped"> <tr> <th class="info col-sm-2">檀信徒氏名</th> <th class="info col-sm-2">お参り</th> <th class="info col-sm-2">日時</th> <th class="info col-sm-2">備考</th> <th class="info col-sm-2">完了チェック</th> </tr> <tr> <td>野田雄大</td> <td>葬式</td> <td>2020-06-27T08:50</td> <td></td> <td> <button class="btn btn-warning" style="display:" onclick="complete(this, &#39;1&#39;,true)">未完了</button> <button class="btn btn-secondary" style="display:none" onclick="complete(this, &#39;1&#39;,false)">完了</button> </td> </tr> </table> <script type="text/javascript"> var complete = function(element, worshipId, doComplete) { /* const token = document.querySelector("meta[name='_csrf']").attributes['content'].value; const header = document.querySelector( "meta[name='_csrf_header']").attributes['content'].value; */ let token = $("meta[name='_csrf']").attr("content"); let header = $("meta[name='_csrf_header']").attr("content"); let url = doComplete ? "/complete" : "/incomplete"; fetch(url, { method: 'POST', headers: { "Content-Type": 'application/x-www-form-urlencoded', [header]: token }, body: `worshipId=${worshipId}` }).then( response => { if (doComplete) { element.style.display = 'none'; element.nextElementSibling.style.display = ''; } else { element.style.display = 'none'; element.previousElementSibling.style.display = ''; } } ); } </script> </div> </div> </div> </div> </body> </html> ``` このような内容になっています。
guest

回答1

0

ベストアンサー

そもそもmeta name="_csrf" 自体出てないですね。そこです。
静的HTMLであればとれるのはこちらでも確認できたので。

fragmentを呼び出すとその中しか読まれないので囲まれた外は何を書いても何も出てきません。
layout/layout.htmlのほうにmetaも書いてください。
jQueryもそちらのほうが読み込まれているはずです。

投稿2020/06/27 05:56

編集2020/06/27 05:56
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NodaYudai

2020/06/27 06:50

ありがとうございます。 先ほど試してみたところ、無事に機能を実装することが出来ました。 改めてAjaxについて学習して理解を深めようと思います。
m.ts10806

2020/06/27 07:16 編集

いえ、今回はAjaxではなくThymeleafの組み方の問題です。 Thymeleafも結局はHTMLを出力しているにすぎないので、JavaScriptで扱いたい要素がきちんとHTMLとして出力しているか確認は必須です。
NodaYudai

2020/07/23 12:21

確認しておりませんでした。お返事遅くなりまして申し訳ございません。 問題が区別できておらず、今後はどの問題がどこで起きているのか切り分けて確認するよう心がけていきます。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問