18910140161

JavaScript-如何使用我创建的代码创建新的“最近搜索”按钮?我仍然在开发工具中收到错误消息,不知道该怎么办-堆栈溢出

顺晟科技

2022-10-19 11:36:56

135

我不仅在本地存储中为最近的搜索创建一个空间,而且在我的主项目页面上创建一个新的工作按钮。我收到一条错误消息,代码最底部的“AddeventListener(”click“,buttonClickHandler);call不能读取”null“属性,所以我想知道我在开始部分哪里出错了。我已经多次尝试重写这部分JS,但现在我不确定从这里开始该怎么办。有什么建议吗?


顺晟科技:

我运行了您的代码并得到了这个错误(尽管我不完全确定这是否是您引用的内容):

var cityFormEl = document.querySelector("#city");
var cityNameInputEl = document.querySelector("#location");
var dateFormEl = document.querySelector("#date");
var dateNameInputEl = document.querySelector("#today");
var historyButtonsEl = document.querySelector("#search-item");
var historyCardEl = document.querySelector("#recent-searches");
var trashEl = document.querySelector("#trash");
var searchHistoryArray = []

var formSubmitHandler = function (event) {
    event.preventDefault();

    // get city name value from input element

    var cityBtn = cityNameInputEl.value.trim();

    // Set city name in local storage and generate history buttons

    if (cityBtn) {
        searchHistoryArray.push(cityBtn);
        localStorage.setItem("citySearch", JSON.stringify(searchHistoryArray));
        localStorage.setItem("dateSearch", JSON.stringify(searchHistoryArray));
        var searchHistoryEl = document.createElement('button');
        searchHistoryEl.className = "btn";
        searchHistoryEl.setAttribute("data-city", "data-date", cityBtn)
        searchHistoryEl.innerHTML = cityBtn;
        historyButtonsEl.appendChild(searchHistoryEl);
        historyCardEl.removeAttribute("style")
        cityNameInputEl.value = "";
    }
    else {
        alert("Please enter a Date and a City name");
    }
}


// Load any past city searches

var loadHistory = function () {
    searchArray = JSON.parse(localStorage.getItem("citySearch"));
    if (searchArray) {
        searchHistoryArray = JSON.parse(localStorage.getItem("citySearch", "dateSearch"));
        for (let i = 0; i < searchArray.length; i++) {
            var searchHistoryEl = document.createElement('button');
            searchHistoryEl.className = "btn";
            searchHistoryEl.setAttribute("data-city", "data-date", searchArray[i])
            searchHistoryEl.innerHTML = searchArray[i];
            historyButtonsEl.appendChild(searchHistoryEl);
            historyCardEl.removeAttribute("style");
        }
    }
}

// Search using search history buttons

var buttonClickHandler = function (event) {
    var cityBtn = event.target.getAttribute("data-city", "data-date",);
    if (cityBtn) {
        formSubmitHandler(cityBtn);
    }
}

// Clear Search History

var clearHistory = function (event) {
    localStorage.removeItem("citySearch", "dateSearch");
    historyCardEl.setAttribute("style", "display: none");
}
cityFormEl.addEventListener("submit", formSubmitHandler);
historyButtonsEl.addEventListener("click", buttonClickHandler);
trashEl.addEventListener("click", clearHistory);
loadHistory();

引发此TypeError的原因在于您的JS的这一行:

选择的元素具有ID等于“search-item”;但是,html中对'search-item'的唯一引用是。要解决这个问题,只需做:

注意'.'而不是“#”。'#'选择IDS,而选择'.'选择classes。此外,尽管我不确定您试图用这个querySelector()选择什么,但我应该警告您,用querySelector()选择类将返回第一个找到的该类元素,而不是该类的所有元素(为此使用querySelectorAll())。希望这能有所帮助。

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航