見出し画像

HTMLのタグに計算式

先日、仕事でWebアプリケーションを作成しました。

もともとEXCELで入力していたシステムをWebアプリケーションに置き換えたのですが、元がEXCELアプリケーションだったため、あちらこちらに計算式があるセルがあり、それらも表示する必要がありました。

計算式の数だけJavaScriptで関数を書いても良いのだけど、管理が大変そうなので、実際に計算結果を表示する要素に計算式を記述できれば、もっとスッキリできないかな?と思い、組んだものです。

実際のコードは載せることはできませんが、おおよそ仕組みわかるものを紹介したいと思います。

記述したHTML

HTMLは以下のような感じで書いています。

<input type="text" data-var="X" />
<input type="text" data-var="Y" />
<span data-cal="X+Y"></span>

data-var 属性にデータ識別子(変数)を記述し、data-cal 属性に計算式を記述します。

計算式を処理するJavascript

処理するJavascriptは以下です。

window.addEventListener("DOMContentLoaded", function() {
  for (const elem of document.querySelectorAll("[data-var]")) {
    elem.addEventListener("change", function() {
      calculate();
    });
  }

  function calculate() {
    const data = {};
    for (const elem of document.querySelectorAll("[data-var]")) {
      data[elem.dataset.var] = (function(name) {
        try {
          if (!elem.value) return 0;
          return parseFloat(elem.value);
        }
        catch {
        }
        return 0;
      })();
    }
    for (const elem of document.querySelectorAll("[data-cal]")) {
      elem.innerText = (function(expr) {
        try {
          with(data) return eval(expr);
        }
        catch {}
        return '';
      })(elem.dataset.cal);
    }
  }
});

data-var 属性を持つ要素の変化で計算を行なっています。

計算処理では、一旦 data-var 属性を持つ要素の値をオブジェクトに収めます。そのオブジェクトを使用して data-cal 属性に記述された計算式を評価(eval)し、結果をその要素にセットしています。

withを使うとオブジェクトの指定が省略できることを利用しています。

data.X 
// 通常は上のように object.property の形式でプロパティを参照するが、
// 以下のようにwith文を使うと、objectの指定が省略できる
with (data) X

実際に書いたコードはもっと複雑ですし、jQueryを利用したので、コードは全然異なるのですが、仕組みとしては上と同じです。

実際に動くサンプル

CodePenで書いた実際のサンプルを載せます。

テキストボックスに数値を入力すると、spanタグにそれぞれ和と差が表示されます。

さいごに

いかがでしたでしょうか。HTMLに計算式を記述して計算するプログラムを紹介しました。

何かの参考になりましたら、幸いです。

この記事が気に入ったらサポートをしてみませんか?