start . me .
Directory path . web , dhtml , lessons .

HTML Document File : factorial.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>factorial</title>
</head>

<body>

    <!-- https://github.com/arkenidar/editor -->

    <script type="text/javascript">
        function factorial(number) {
            // non-negative integer number
            const validInput = Number.isInteger(number) && number >= 0
            if (validInput == false) return NaN
            // accumulate multiplications
            for (var result = 1; number != 0; number--)
                result = result * number
            // output
            return result
        }
    </script>

    <h1>Factorial</h1>
    <p>Calculate the factorial of a non-negative integer number.</p>
    <p>Factorial of 0 is 1.</p>

    <script type="text/javascript">
        function inputNumberButtons() {
            inputNumber.value = parseInt(inputNumber.value) + parseInt(this.innerText)
            validateInputFactorial(inputNumber)
        }
    </script>
    <button type="button" onclick="inputNumberButtons.call(this)">-1</button>
    <style>
        #inputNumber {
            width: 3em;
            border: 1px solid black;
        }
    </style>
    <input type=number id=inputNumber placeholder="integer number" min=0 step=1 value=0
        oninput="validateInputFactorial(this)" required>
    <button type="button" onclick="inputNumberButtons.call(this)">+1</button>
    factorial of <span id=inputNumberDisplay></span> is: <span id=outputFactorial></span>.

    <script type="text/javascript">
        // handle input event
        inputNumber.oninput = (event) => validateInputFactorial(inputNumber)
        // initialize initial state
        validateInputFactorial(inputNumber)

        // input handling function
        function validateInputFactorial(inputFactorial) {
            // input validity check
            if (inputFactorial.validity.valid == false) inputFactorial.value = 0
            // normalize input value e.g. remove leading zeros
            inputFactorial.value = parseInt(inputFactorial.value)
            // input to output
            outputFactorial.innerText = factorial(parseInt(inputFactorial.value))
            inputNumberDisplay.innerText = inputFactorial.value
        }
    </script>

    <!-- https://github.com/arkenidar/editor -->

    <script src="https://arkenidar.com/web/show-source.js"></script>

</body>

</html>