LoginSignup
ryo-0213
@ryo-0213

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Javascriptが動かない

前提・実現したいこと

javascriptでリアルタイムの計算がしたい

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

chromeを使っているのでコンソールなどで原因を調べたら Failed to load resource: the server responded with a status of 404 (Not Found)
と表示されていましたが原因がわからないです。

該当のソースコード

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="../layout/app.jsp">
    <c:param name="content">
        <h2><c:out value="${sessionScope.orderer.company_name }" />の単価</h2>
        <c:if test="${errorsMap != null}">
            <div>
                <c:forEach items="${errorsMap}" var="errorsMap"><c:out value="${errorsMap.key + 1}" />行目の
                    <c:forEach items="${errorsMap.value}" var="errors">
                        <c:out value="${errors}" />
                    </c:forEach>
                </c:forEach>
            </div>
        </c:if>
        <c:if test="${errors != null }">
            <div><c:out value="${errors}" />
            </div>
        </c:if>
        <form method="POST" action="<c:url value='/wholesales/new' />">
            <table>
                <tbody>
                    <tr>
                        <th>品番</th>
                        <th>定価</th>
                        <th>掛け率</th>
                        <th>単位</th>
                        <th>単価</th>
                    </tr>
                    <c:forEach var="i" begin="0" end="9">
                        <tr>
                            <td><input type="text" name="product_number"
                                value="<c:out value='${numberList[i] }' />"></td>
                            <td><input id="input01" type="text" name="normal_price"
                                value="<c:out value='${priceList[i] }' />" /></td>
                            <td><input id="input02" type="text" name="ratio"
                                value="<c:out value='${ratioList[i] }' />"></td>
                            <td><input type="text" name="unit"
                                value="<c:out value='${unitList[i] }' />"></td>
                            <td><input id="answer" type="text" name="total" value=""></td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>
            <input type="hidden" name="_token" value="${_token }" />
            <button type="submit">登録</button>
        </form>
        <script type="text/javascript">
            window.onload = function() {
                var input01 = document.getElementById("input01"); // DOM要素を用意しておく
                var input02 = document.getElementById("input02"); // DOM要素を用意しておく
                var answer = document.getElementById("answer"); // DOM要素を用意しておく

                input01.value = ""; // 初期化
                input02.value = ""; // 初期化
                answer.value = ""; // 初期化

                input02.onkeyup = function() { // キー入力が終わった瞬間に実行される関数の宣言
                    answer.innerHTML = parseInt(input01.value, 10) * parseInt(input02.value, 10); // 実際の計算
                };
            }
        </script>
    </c:param>
</c:import>
0

1Answer

ソースコードを拝見したところ、目視でわかる問題が2点あります。
おそらくブラウザのコンソールではエラーとして出力されない内容です。

(1) 計算結果の代入
定価と掛け率の計算結果を、単価に代入していますが、
inputタグのinnerHTMLプロパティは画面には反映されません。
代入すべきプロパティは初期化の部分をご確認頂ければと思います。

(2) inputを記述しているテーブル行で c:forEach を使用している
数値を入力するinputは複数行存在すると思われますが、
この実装では同時に複数の同一idが存在する状態になり、
意図しない動作になることが予想されます。

基本的には、idは文字通りユニークとなる必要がありますので、
ループ等で項目を生成する場合は、idの付け方を工夫する必要があります。

0Like

Comments

  1. @ryo-0213

    Questioner
    色々と考えましたが、idを捕まえるのではなく<tr>にイベントリスナを設定する方法で落ち着きました。回答いただきありがとうございます。

Your answer might help someone💌