HTML、HTML贷款计算器

本程序编写html贷款计算器,在js中进行值校验和结果计算。

工具:

ide:vscode

开发工具:jquery、bootstrap、typescript


loan.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>贷款计算器</title>

  <link rel="stylesheet" href="../css/bootstrap.min.css" />
  <style>
    /* 反馈提示 */
    .feedback {
      background-color: rgba(48, 45, 45, 0.5);
      min-width: fit-content;
      padding: 20px;
      border-radius: 5px;
      color: #fff;
      position: absolute;
      top: 15vh; 
      left: 50vw;
      transform: translateX(-50%);
      display: none;
    }
  </style>
</head>
<body>
  <!-- 容器 -->
  <div class="container-md mt-3 p-2">
    <!-- 主体 -->
    <div class="main">
      <!-- 响应式行 -->
      <div class="row">
        <!-- 左列 -->
        <div class="col-12 col-md-6">
            <!-- 左列标题 -->
            <h3>Enter Loan Data</h3>
            <!-- 输入框 -->
            <form action="javascript:void(0)">
              <div class="d-flex align-items-center flex-wrap justify-content-between">
                <label for="amountOfLoan">Amount of the loan($):</label>
                <input type="text" id="amountOfLoan" class="form-control w-50 mt-2" />
  
                <label for="annualInterest">Annual interest(%):</label>
                <input type="text" id="annualInterest" class="form-control w-50 mt-2" />
  
                <label for="repaymentPeriod">Repayment period(years):</label>
                <input type="text" id="repaymentPeriod" class="form-control w-50 mt-2" />
  
                <label for="zipcode">Zipcode (to find lenders):</label>
                <input type="text" id="zipcode" class="form-control w-50 mt-2" />
  
                <label for="payment">Approximate Payments:</label>
                <input type="button" id="calculate" class="btn btn-outline-primary my-2" value="Calculate" />
              </div>
            </form>
  
            <!-- 结果展示 -->
            <div class="feedback-info">
              <ul class="list-unstyled">
                <li>
                  <span class="d-inline-block w-50">Monthly payment</span>
                  <span class="monthlyPayment"></span>
                </li>
                <li class="my-1">
                  <span class="d-inline-block w-50">Total payment</span>
                  <span class="totalPayment"></span>
                </li>
                <li>
                  <span class="d-inline-block w-50">Total Interest</span>
                  <span class="totalInterest"></span>
                </li>
              </ul>
            </div>
        </div>

        <!-- 右列 -->
        <div class="col-12 col-md-6 p-2">
          <div class="d-flex flex-column align-items-center justify-content-center">
            <h5>Loan Balance, Cumulative Equity, and Interest Payments</h5>
            <img src="../resources/img//u=3381965374,1747117691&fm=253&fmt=auto&app=138&f=JPEG.webp" 
              alt="Loan Balance, Cumulative Equity, and Interest Payments" 
              title="Loan Balance, Cumulative Equity, and Interest Payments"
              style="width: 100%; height: 300px;" class="bg-opacity-75 rounded" />
          </div>
        </div>
      </div>
    </div>

    <!-- 尾部 -->
    <div class="footer py-2 px-md-5">
      <!-- 赞助人列表 -->
      <span class="d-inline-block fw-bold fs-5">Sponsors:</span>
      <span class="d-inline-block ms-5">Apply for your loan with one of these fine lenders</span>
      <ul class="lender-list mt-3" style="margin-left: 11em;">
      </ul>
    </div>
  </div>

  <!-- 提示框 -->
  <div class="feedback"></div>

  <script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
  <script type="text/javascript" src="../js/bootstrap.bundle.min.js"></script>
  <script type="text/javascript" src="../ts/index.js"></script>
</body>
</html>

index.ts:

$(function() {
  /**
   * 检验输入框
   * 
   * node: 输入框节点
   * 
   * label: 标签信息
   */
  function check(node: JQuery<HTMLElement>, label?: string): boolean {
    var val = ("" + node.val()).trim(), // 节点值
        feedback = $(".feedback"),      // feedback节点
        isValid = true;                 // bool变量

    // 检验是否为空
    if("" === val && !!label) {
      // 前节点设置字体样式
      node.prev().css({"color": "red"});
      // 设置feedback提示文本
      feedback.text(`${label} cannot be empty`);
      isValid = false;
    } else

    // 检验是否为数字
    if(isValid && !/^\d+(\.\d+)*$/.test(val)) {
      node.prev().css({"color": "red"});
      feedback.text(`${label} is not a number`)
      isValid = false;
    }

    // 检验无效,显示feedback提示
    if(!isValid) {
      // 淡入并在3秒后淡出
      feedback.fadeIn(300, function() {
        setTimeout(() => {
          $(this).fadeOut();
          node.prev().css({"color": "black"});
        }, 3000);
     });
    }
    return isValid;
  }
  
  // 按钮注册点击事件
  $("#calculate").on("click", function() {
    const amountOfLoan = $("#amountOfLoan"),
          annualInterest = $("#annualInterest"),
          repaymentPeriod = $("#repaymentPeriod");
    
    // 如果检验有效,设置结果文本
    if(check(amountOfLoan, "Amount of Loan") &&
        check(annualInterest, "Annual of Interest") &&
        check(repaymentPeriod, "Repayment Period")) {
          var amount = parseFloat(<string>amountOfLoan.val()),
              interest = parseFloat(<string>annualInterest.val()) / 100 / 12,
              payments = parseFloat(<string>repaymentPeriod.val()) * 12,
              x = Math.pow(1 + interest, payments),
              monthly = (amount * x * interest) / (x - 1),
              lenderHTML = "";
          
          $(".monthlyPayment").text(`$${monthly.toFixed(2)}`);
          $(".totalPayment").text(`$${(monthly * payments).toFixed(2)}`);
          $(".totalInterest").text(`$${((monthly * payments) - amount).toFixed(2)}`);

          const lenderList: string[] = ["Bank of JavaScript", "HTML Credit Union"];
          for (const lender of lenderList) {
            lenderHTML += `<li>${lender}</li>`;
          }
          $(".lender-list").html(lenderHTML);
    } else { // 否侧,清空结果文本
      if("" !== $(".monthlyPayment").text()) {
        $(".monthlyPayment").text("");
        $(".totalPayment").text("");
        $(".totalInterest").text("");
        $(".lender-list").html("");
      }
    }
  });
});


index.js:

$(function () {
    /**
     * 检验输入框
     *
     * node: 输入框节点
     *
     * label: 标签信息
     */
    function check(node, label) {
        var val = ("" + node.val()).trim(), // 节点值
        feedback = $(".feedback"), // feedback节点
        isValid = true; // bool变量
        // 检验是否为空
        if ("" === val && !!label) {
            // 前节点设置字体样式
            node.prev().css({ "color": "red" });
            // 设置feedback提示文本
            feedback.text("".concat(label, " cannot be empty"));
            isValid = false;
        }
        else 
        // 检验是否为数字
        if (isValid && !/^\d+(\.\d+)*$/.test(val)) {
            node.prev().css({ "color": "red" });
            feedback.text("".concat(label, " is not a number"));
            isValid = false;
        }
        // 检验无效,显示feedback提示
        if (!isValid) {
            // 淡入并在3秒后淡出
            feedback.fadeIn(300, function () {
                var _this = this;
                setTimeout(function () {
                    $(_this).fadeOut();
                    node.prev().css({ "color": "black" });
                }, 3000);
            });
        }
        return isValid;
    }
    // 按钮注册点击事件
    $("#calculate").on("click", function () {
        var amountOfLoan = $("#amountOfLoan"), annualInterest = $("#annualInterest"), repaymentPeriod = $("#repaymentPeriod");
        // 如果检验有效,设置结果文本
        if (check(amountOfLoan, "Amount of Loan") &&
            check(annualInterest, "Annual of Interest") &&
            check(repaymentPeriod, "Repayment Period")) {
            var amount = parseFloat(amountOfLoan.val()), interest = parseFloat(annualInterest.val()) / 100 / 12, payments = parseFloat(repaymentPeriod.val()) * 12, x = Math.pow(1 + interest, payments), monthly = (amount * x * interest) / (x - 1), lenderHTML = "";
            $(".monthlyPayment").text("$".concat(monthly.toFixed(2)));
            $(".totalPayment").text("$".concat((monthly * payments).toFixed(2)));
            $(".totalInterest").text("$".concat(((monthly * payments) - amount).toFixed(2)));
            var lenderList = ["Bank of JavaScript", "HTML Credit Union"];
            for (var _i = 0, lenderList_1 = lenderList; _i < lenderList_1.length; _i++) {
                var lender = lenderList_1[_i];
                lenderHTML += "<li>".concat(lender, "</li>");
            }
            $(".lender-list").html(lenderHTML);
        }
        else { // 否侧,清空结果文本
            if ("" !== $(".monthlyPayment").text()) {
                $(".monthlyPayment").text("");
                $(".totalPayment").text("");
                $(".totalInterest").text("");
                $(".lender-list").html("");
            }
        }
    });
});

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值