【发布时间】:2022-01-28 10:20:50
【问题描述】:
我正在尝试将链接添加到我的导航栏以查找用户进行的搜索,以及用户是否喜欢该链接。我目前想要实现的是,如果“过去搜索”部分已经包含当前搜索,则不要添加当前搜索以避免重复。我正在使用localStorage 将这些数据与字符串化数组(alreadySearched)一起存储,并检查该数组是否包含当前搜索;我的问题是该函数总是返回 false。 收藏夹下拉菜单也会发生同样的事情。我做错了什么?
这是我的代码:
// primary movie information (API #1)
var getMovie = function(title) {
$("#result").addClass("hidden")
$("#main").removeClass("hidden");
$("#search-form").trigger("reset");
//format the OMDB api url
var apiUrl = `http://www.omdbapi.com/?t=${title}&plot=full&apikey=836f8b0`
//make a request to the url
fetch(apiUrl)
.then(function(response) {
// request was successful
if (response.ok) {
response.json().then(function(movieData) {
// console.log(movieData)
var movieTitle = movieData.Title
getMovieId(movieTitle);
getSoundTrack(movieTitle);
getTrailer(movieTitle);
var movieObj = {
title: movieTitle,
}
var pastSearches = loadPastSearches();
var alreadySearched = false
if (pastSearches) {
pastSearches.forEach(s => {
if (s.title === movieTitle) {
alreadySearched = true;
}
})
}
if (!alreadySearched) {
for (var item of pastSearches) {
let searchEl = document.createElement("a")
let pastSearchTitle = item.title
$(searchEl).text(pastSearchTitle)
$(searchEl).addClass("past-search-item");
$("#past-search-dropdown").append(searchEl)
$(searchEl).click(function(e) {
e.preventDefault();
let title = pastSearchTitle
getMovie(title)
getQuotes(title)
});
}
}
saveSearch(movieObj)
showMovie(movieData);
});
} else {
alert("Error: title not found!");
}
})
.catch(function(error) {
alert("Unable to connect to CineXScore app");
console.log(error)
});
};
// save past search
var saveSearch = function(movieObj) {
var pastSearches = loadPastSearches();
pastSearches.push(movieObj);
localStorage.setItem("movieObjects", JSON.stringify(pastSearches))
}
loadPastSearches = function() {
var pastSearches = JSON.parse(localStorage.getItem("movieObjects"));
if (!pastSearches || !Array.isArray(pastSearches)) {
var pastSearches = []
}
return pastSearches;
}
// dropdown favorite soundtrack buttons
var saveTrack = function(trackObj) {
var faveTracks = JSON.parse(localStorage.getItem("trackObjects"));
if (!faveTracks || !Array.isArray(faveTracks)) {
var faveTracks = []
}
var alreadySearched = false
if (faveTracks) {
faveTracks.forEach(t => {
if (t.name === trackObj.name) {
alreadySearched = true;
}
})
}
if (!alreadySearched) {
let trackEl = document.createElement("a")
$(trackEl).addClass("fave-track");
$(trackEl).text(trackObj.name);
$(trackEl).attr("href", trackObj.url);
$(trackEl).attr("target", "_blank")
$("#favorite-tracks-dropdown").append(trackEl)
}
faveTracks.push(trackObj);
localStorage.setItem("trackObjects", JSON.stringify(faveTracks))
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- Navigation Menu -->
<nav class="navbar navbar-default navbar-fixed-top">
<a id="logo" class="navbar-brand">CineXScore</a>
<div class="dropdown navbar-brand">Past Searches
<i class="fa fa-caret-down"></i>
<div id="past-search-dropdown" class="dropdown-content">
<a id="clear-searches">Clear</a>
</div>
</div>
<div class="dropdown navbar-brand">Favorite Tracks
<i class="fa fa-caret-down"></i>
<div id="favorite-tracks-dropdown" class="dropdown-content">
<a id="clear-favorites">Clear</a>
</div>
</div>
</nav>
【问题讨论】:
-
“不起作用”是什么意思?预期的结果是什么,而您得到了什么?
-
它会重新添加本地存储中的所有元素,无论标题是否已被搜索(因此,如果您搜索“泰坦尼克号”两次,那么它将在下拉列表中两次)跨度>
-
目前我还没有明确的解决方案,但我想指出代码存在一些问题。首先,
loadPastSearches应该使用声明符(例如var)并将其放在其他函数之前,或者简单地使用function loadPastSearches() {...}声明它。其次,每当你有一个 if 语句来检查本地存储项是否是一个数组时,你就是在你想要更改的变量中添加一个var,从而声明一个新的变量来执行谁知道什么。最后,console.log是你的朋友(用于调试)。 -
感谢您的帮助!如果我将“var”更改为这样,是否可以解决您提到的问题之一? ` var loadPastSearches = function() { let pastSearches = JSON.parse(localStorage.getItem("movieObjects")); if (!pastSearches || !Array.isArray(pastSearches)) { pastSearches = [] } return pastSearches; }`
-
不,我的意思是声明符(即
var、let或const)将“重新声明”一个变量,这肯定不会如你所愿.您应该在我描述的区域中删除它,因为您已经声明了变量,所以您实际上可以改变变量。
标签: javascript html jquery local-storage