文胸尺码计算器 'addEventListener' 为空

Bra size calculator 'addEventListener' of null

我一直在研究这个胸罩尺寸计算器,但是当 运行 这段代码时出现 addEventListener null 错误。当 运行 在本地时它工作正常但当我部署它时它会变得疯狂。我什至尝试将 addEventListener 放入 bra_size_calculator 函数中,但仍然给了我同样的错误。我不确定我错过了什么。

JS

window.onload = function () {
    var bra_size_calculator = (function(){
        
        var size_diff = {
            1: 'A',
            2: 'B',
            3: 'C',
            4: 'D',
            5: 'DD/E',
            6: 'F(DDD)/FF',
            7: 'G/GG',
            8: 'H/HH',
            9: 'I/J',
            10: 'J/JJ',
            11: 'K',
            12: 'L',
            13: 'M',
            14: 'N',
        };

        var band_size = [28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56],
            fixResultStr = 'Your Result is = ',
            loadingScreen = document.querySelector('.loading_screen');
        
        function displayResult() {

            var bandInput = document.querySelector("input[name='band']").value,
            sizeSet,
            cupInput = document.querySelector("input[name='cup']").value;

            var bandVal = validateBand(bandInput),
                cupVal = validateCup(bandVal, cupInput);
                

            if (bandVal && cupVal) {
                var valDiff = (cupVal - bandVal).toString(),
                    noResult = document.querySelector('.no_result');
                if (!size_diff[valDiff]) {
                    noResult.innerHTML = '';
                    loadingScreen.classList.add('active');
                    setTimeout(function () {
                        noResult.innerHTML = 'Could not find a suggested result for you. Enter other values.';
                        loadingScreen.classList.remove('active');
                    }, 700);
                } else {
                    noResult.innerHTML = '';
                    sizeSet = [bandVal.toString(), size_diff[valDiff]];
                }
            }


            var resultHtml = document.querySelector('.result_text'),
                redirectButtons = document.querySelector('.redirect_buttons');
            if (sizeSet.length < 1) {
                resultHtml.innerHTML = '';
                redirectButtons.innerHTML = '';
            } else {
                resultHtml.innerHTML = '';
                redirectButtons.innerHTML = '';
                loadingScreen.classList.add('active');
                setTimeout(function () {
                    resultHtml.innerHTML = fixResultStr + sizeSet[0] + sizeSet[1];
                    showRedirectButtons(sizeSet, redirectButtons);
                    loadingScreen.classList.remove('active');
                }, 700);
            }
        };

        function showRedirectButtons(sizeset, redirectbuttons) {
            var possibleSizes = sizeset[1].split(/[()\/]+/);
            possibleSizes.forEach(function (cup) {
                var ahref = document.createElement('a');
                ahref.setAttribute('class', 'result_redirect');
                ahref.setAttribute('href', '/collections/' + sizeset[0] + cup);
                ahref.innerHTML = `Shop Bras for Size ${sizeset[0]}${cup}`;
                redirectbuttons.appendChild(ahref);
            });
        };


        function validateBand(value) {
            var errMsg = document.querySelector('.band_error_msg');
            if (!value) errMsg.innerHTML = 'This field cannot be empty';
            else {
                var valNum = parseInt(value);
                if (isNaN(valNum) || valNum < 28 || valNum > 56) {
                    errMsg.innerHTML = 'Please enter a number between 28 and 56';
                } else {
                    errMsg.innerHTML = '';
                    return estimateBand(valNum, errMsg);
                }
            }

            return null;
        };
        
        function validateCup(bandVal, value) {
            var errMsg = document.querySelector('.cup_error_msg');
            if (!bandVal) {
                errMsg.innerHTML = 'Cannot validate; Band size is invalid';
                return null;
            } else {
                if (!value) errMsg.innerHTML = 'This field cannot be empty';
                else {
                    var valNum = parseInt(value);
                    if (isNaN(valNum)) errMsg.innerHTML = 'Invalid input; it must be a number';
                    else if (valNum <= bandVal) errMsg.innerHTML = 'Cup size must be greater than the band size';
                    else {
                        errMsg.innerHTML = '';
                        return valNum;
                    }
                }
            }

            return null;
        };

        function estimateBand(value, errMsg) {
            var newVal = value,
                foundIt = band_size.includes(value);
            if (foundIt) return value;
            else {
                while (!foundIt) {
                    newVal += 1;

                    if (newVal > 56) break;

                    foundIt = band_size.includes(newVal);
                }
                errMsg.innerHTML = `Band size ${value} is rounded up to the nearest existing size of ${newVal}`;
                document.querySelector("input[name='band']").value = newVal;
                return newVal;
            }
        };
        return {
            displayResult: displayResult
        }
        
    })();



    (function() {
        document.querySelector('#measureForm button').addEventListener('click', function (event) {
            event.preventDefault();
            bra_size_calculator.displayResult();
        });
    })();

};

HTML

        <div class="row" id="desktopContainer">
            <div class="col-xs-12 m-top-sm text-left">
                <h3 class="text-center braFitTitle">
                    <span style="font-weight: bold">How To Measure Your Bra Size</span>
                </h3>

                <div class="row m-top-lg">
                    <div class="col-xs-6">
                        <img src="#" class="lazy-extended already-loaded main-image" data-original="/images/espots/030718ec_bra_measure_guide_00012138.jpg" alt="Bra Fit Guide">
                    </div>

                    <div class="col-xs-6">
                        <div class="measurements">
                            <form id="bra-size-calculator" class="measurement-form">
                                <div class="size-fields">
                                    <div class="inst-1">
                                        <h3>1. Measure Your Cup Size</h3>
                                        <p>
                                            Put on your best-fitting non-padded bra. Using a measuring tape, measure
                                            around the fullest part of your bust. Make sure the tape is leveled, not too
                                            tight, and straight around your back.
                                        </p>
                                        <input class="measure_input" type="number" name="cup" id="cup-size" placeholder="Cup Measurement Inches">
                                        <div class="cup_error_msg"></div>
                                    </div>
                                    <div class="inst-2">
                                        <h3>2. Measure Your Band Size</h3>
                                        <p>
                                            Using a measuring tape, measure around your ribcage, just beneath your bust,
                                            on an exhale. Make sure the tape is pulled snug, leveled and straight around
                                            your back.
                                        </p>
                                        <div class="col p-0 d-flex mt-4 justify-content-between">
                                            <div class="cup">
                                                <input class="measure_input" type="number" name="band" id="band-size" placeholder="Band Measurement Inches">
                                                <div class="band_error_msg"></div>
                                            </div>

                                            <div class="submit-btn">
                                                <button type="submit" id="submit" class="measure_submit navigable" name="submit">
                                                    Get My Size
                                                </button>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </form>
                            <div class="result_section">
                                <div class="no_result"></div>
                                <h2 class="result_text" data-open-accessibility-text-original="32.3px" style="font-size: 32.3px"></h2>
                                <div class="redirect_buttons"></div>
                            </div>
                        </div>

                        <div class="loading_screen">
                            <img src="//cdn.shopify.com/s/files/1/0469/3517/9429/t/6/assets/loading.gif?v=14919295063927105620">
                        </div>

                        <div id="modal-brafit-content" style="display: none"><p>YO</p></div>
                        <div id="quiz-content" class="text-center mt-5">
                            <span class="quiz_txt white-txt" id="quiz_txt">Is your bra size letting you down? Answer just a few questions so that we can help
                                recommend the fit of your bra</span><br>
                            <button type="button" class="btn btn-primary btn-lg white" id="modal-brafit-btn">
                                Start Bra Fit Quiz
                            </button>
                        </div>
                    </div>
                </div>
            </div>
        </div>

您正在将事件侦听器添加到 document.querySelector('#measureForm button')。但是,您的 HTML 中没有带有“measureForm”ID 的元素。因此,document.querySelector returns null.

因此,您只需将“measureForm”ID 添加到您尝试添加侦听器的元素,或更改 document.querySelector('#measureForm button') 中使用的选择器。