Search code examples
javascripthtml

On search error "Cannot read properties of null (reading 'value')"


I created a search similar to the one on booking that I want to integrate into the site and I get the following error... after choosing a checkin, checkout, select the number of rooms, adults and children respectively their age and press the button the search throws the following error in the console

Cannot read properties of null (reading 'value')

And I can't figure out where I'm going wrong. I am attaching the code below.

HTML

<form id="booking-search-form" action="https://www.booking.com/searchresults.ro.html" method="get"
      target="_blank" style="display: flex; justify-content: center;">
    <div class="container">
        <div class="hakolal-search-row-bk">
            <div class="col-sm hakolal-search-conf">
                <input type="date" id="checkin" name="checkin">
            </div>
            <div class="col-sm hakolal-search-conf">
                <input type="date" id="checkout" name="checkout">
            </div>
            <div class="col-sm hakolal-search-conf">
                <div class="dropdown">
                    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1"
                            data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
                    Number of guests</button>
                    <div id="content" class="content dropdown-menu" aria-labelledby="dropdownMenu1">
                        <div class="list">
                            <label for="rooms" class="list">Choose how many rooms</label>
                            <input type="number" class="list quantity" value="0" />
                        </div>
                        <div class="list">
                            <label for="adults" class="list">Choose the number of adults</label>
                            <input type="number" class="list quantity" value="1" />
                        </div>
                        <div class="list" id="children-list">
                            <label for="children" class="list">Choose the number of children</label>
                            <input type="number" class="list quantity" value="0" />
                            <div id="children-ages"></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-sm hakolal-search-conf">
                <button type="submit" class="btn btn-info hakolal-search-bk">Search</button>
            </div>
        </div>
    </div>
</form>

JavaScript:

const form = document.getElementById("booking-search-form");
console.log("Formular:", form);

// Add event listener to children quantity input
const childrenQuantityInput = document.querySelector("#children-list input.quantity");

childrenQuantityInput.addEventListener("change", () => {
    const childrenAgesDiv = document.querySelector("#children-ages");
    childrenAgesDiv.innerHTML = ""; // Clear children ages list

    // Add input for each child age
    for (let i = 1; i <= childrenQuantityInput.value; i++) {
        const label = document.createElement("label");
        label.setAttribute("for", `child-${i}-age`);
        label.classList.add("list");
        label.innerText = `Child ${i} age:`;

        const input = document.createElement("input");
        input.setAttribute("id", `child-${i}-age`);
        input.setAttribute("name", `age-${i}`);
        input.setAttribute("type", "number");
        input.setAttribute("min", "0");
        input.setAttribute("max", "17");
        input.classList.add("list");
        input.value = "0";

        const div = document.createElement("div");
        div.appendChild(label);
        div.appendChild(input);
        childrenAgesDiv.appendChild(div);
    }
});

console.log("Input numar copii:", childrenQuantityInput);

const checkinInput = document.getElementById("checkin");
const checkoutInput = document.getElementById("checkout");

form.addEventListener("submit", (event) => {
    event.preventDefault();

    console.log(checkinInput); // check if element exists
    console.log(checkoutInput); // check if element exists
    const checkinValue = checkinInput.value;
    console.log(checkinValue); // display selected value in console log
    const checkoutValue = checkoutInput.value;
    console.log(checkoutValue); // display selected value in console log
    if (!checkinValue || !checkoutValue) {
        alert("Please enter check-in and check-out dates");
        return;
    }

    // check if is selectet an room
    const numberOfRooms = document.querySelector("#content input:nth-of-type(1)").value;
    if (numberOfRooms < 1) {
        alert("Please select at least one room");
        return;
    }
    console.log("Numarul de camere selectat:", numberOfRooms);

    // check if is selected an adult 
    const numberOfAdults = document.querySelector("#adults-list input.list.quantity").value;
    if (numberOfAdults < 1) {
        alert("Please select at least one adult");
        return;
    }
    console.log("Numarul de adulti:", numberOfAdults); // Valoarea nu se adauga, nu afiseaza nimic in consola

    const numberOfChildren = document.querySelector("#children-list input.list.quantity").value;
    const childrenAges = Array.from(document.querySelectorAll("#children-ages input"))
        .map((input) => input.value)
        .join(",");
    for (let i = 1; i <= numberOfChildren; i++) {
        const childAgeInput = document.querySelector(`#child-${i}-age`);
        if (childAgeInput.value < 1) {
            alert(`Please enter a valid age for child ${i}`);
            return;
        }
    }
    console.log("Numarul de copii:", numberOfChildren); // Valoarea nu se adauga, nu afiseaza nimic in consola
    console.log("Varsta copiilor:", childrenAges); // Valoarea nu se adauga, nu se afiseaza nimic in consola

    // Value of parameter ss is harcoded
    // ss parameter represent a location
    const url =
        `https://www.booking.com/searchresults.ro.html?ss=Romania&checkin=${checkinValue}&checkout=${checkoutValue}&nr_rooms=${numberOfRooms}&nr_adults=${numberOfAdults}&nr_children=${numberOfChildren}&group_children=${childrenAges}`;
    window.open(url, "_blank");
});

I tend to think that the problem is that the dropdown does not take the value from the number of rooms, adults and children of the respective age for each. But I'm not really sure.

The code, after selecting all the values in the form, creates a URL and makes a search in booking based on the parameters sent by the form.

Can you help me solve the problem? I can't figure out where I'm going wrong.


Solution

  • the error you receiving its because its trying to read a value of a html element that does'nt exist

    this issue is caused by this line:

    const numberOfAdults = document.querySelector("#adults-list input.list.quantity").value;
    

    adults-list element doesn't exist in the HTML

    you can add the element in a div container

    <div class="list" id="adults-list">
        <label for="adults" class="list">Choose the number of adults</label>
        <input type="number" class="list quantity" value="1" />
    </div>