#javascript #html #jquery
Вопрос:
Я снова работаю над домашним заданием по jQuery, и у меня возникла проблема с отображением результатов для функции поиска с помощью Google Books API. У меня есть форма, в которой отображается поисковый запрос, максимальное количество результатов для отображения, а также страница для отображения. На моей странице также есть раздел для отображения моей книжной полки GB, которая функционирует должным образом, я не получаю ошибок в консоли инструментов разработчика Chrome, и VS Code не показывает никаких ошибок. Я взял свою строку поиска, поместил ее в Chrome и ввел значения переменных, чтобы убедиться, что я получаю результаты, что я и делаю. Я уверен, что мне не хватает чего — то маленького, что ускользает от моих глаз.
Код JS
/*jQuery code to show advanced search bar*/
/*Also hides advanced search link once clicked*/
$(document).ready(function(){
$("#advanced-search").hide();
$("#showAdvancedSearch").on('click',function(){
$("#advanced-search-show").hide();
$("#advanced-search").show();
});
});
/*begin bookshelf*/
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 amp;amp; this.status == 200) {
var gbaObject = JSON.parse(this.responseText);
var gbaHTML = '';
gbaObject.items.forEach(function (item) {
if (typeof item.volumeInfo.imageLinks != "undefined" amp;amp; item.volumeInfo.imageLinks != null amp;amp; item.volumeInfo.imageLinks != "") {
gbaHTML = `<div class="div200 border" onclick="singleGoogleBooks('` item.id `');">
<div>
<img src="` item.volumeInfo.imageLinks.smallThumbnail `" alt="` item.volumeInfo.title `" title="` item.volumeInfo.title `"/>
<div class="title"><strong>Title:</strong> ` item.volumeInfo.title `</div>
</div>
</div>`;
}
});
$('#displayBookshelf').html(gbaHTML);
}
};
xmlhttp.open("GET", "https://www.googleapis.com/books/v1/users/115951386289303716892/bookshelves/1001/volumes?startIndex=0amp;maxResults=10", true);
xmlhttp.send();
/*end bookshelf*/
/*begin booksearch*/
function bookSearch() {
var term = $("#q-term").val();
var maxResults = parseInt($("#maxResults").val());
var goToPage = parseInt($("#goToPage").val());
var startIndex = parseInt(goToPage) * parseInt(maxResults);
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 amp;amp; this.status == 200) {
var gbaSearchObject = JSON.parse(this.responseText);
var gbaSearchHTML = '';
gbaSearchObject.items.forEach(function (item) {
if (typeof item.volumeInfo.imageLinks != "undefined" amp;amp; item.volumeInfo.imageLinks != null amp;amp; item.volumeInfo.imageLinks != "") {
gbaSearchHTML = `<div class="div200 border" onclick="singleGoogleBooks('` item.id `');">
<div>
<img src="` item.volumeInfo.imageLinks.smallThumbnail `" alt="` item.volumeInfo.title `" title="` item.volumeInfo.title `"/>
<div class="title"><strong>Title:</strong> ` item.volumeInfo.title `</div>
</div>
</div>`;
}
});
$('#displayBookResults').html(gbaSearchHTML);
}
};
xmlhttp.open("GET", "https://www.googleapis.com/books/v1/volumes?q=" term "amp;startIndex=" startIndex "amp;maxResults=" maxResults "", true);
xmlhttp.send();
return false;
}
/*end booksearch*/
/*send user to details page onclick of results (PDP)*/
function singleGoogleBooks(bid) {
window.location.href = '/single-google-books/?bid=' bid '';
}
/*end PDP*/
HTML-код
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lee Baldwin - Milestone 2</title>
<!--import external stylesheet-->
<link href="styles/main.css" rel="stylesheet" />
<!-- import jquery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!--import external javascript-->
<script src="scripts/main.js"></script>
</head>
<body>
<div class="header">
<h1>Lee Baldwin</h1>
<h3>Kennesaw State University Student</h3>
</div>
<div>
<ul>
<li><a href="https://www.leebaldwin.website/Milestone1/leebaldwin_milestone1a.html">Milestone 1a</a></li>
<li><a href="https://www.leebaldwin.website/Milestone1/leebaldwin_milestone1b.html">Milestone 1b</a></li>
<li><a href="leebaldwin_milestone2.html">Milestone 2</a></li>
<li><a href="#">Milestone 3</a></li>
<li><a href="#">Milestone 4</a></li>
</ul>
</div>
<div class="search-bar">
<label for="searchForm">Keywords:</label>
<form method="post" action="javascript:;" id="searchForm" onsubmit="return bookSearch()">
<input type="text" id="q-term" required="required"/>
<button type="submit">Submit</button>
<span id="advanced-search-show"><a href="javascript:;" id="showAdvancedSearch">Advanced Search</a></span>
<span class="search-bar" id="advanced-search">
<label for="maxResults">Max Results:</label>
<select id="maxResults" onchange="bookSearch()">
<option>10</option>
<option>20</option>
<option>30</option>
<option>40</option>
</select>
<label for="goToPage">Go to Page:</label>
<select id="goToPage" onchange="bookSearch()">
<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
<option value="5">6</option>
</select>
</span>
</div>
<h2>Search Results</h2>
<div class="grid-container" id="displayBookResults">
</div>
<h2>My Bookshelf</h2>
<div class="grid-container" id="displayBookshelf">
</div>
</body>
</html>
консоль.журнал
main.js:19 (5) [{…}, {…}, {…}, {…}, {…}]0: {kind: "books#volume", id: "eSIsAwAAQBAJ", etag: "vL5v8dEFNzc", selfLink: "https://www.googleapis.com/books/v1/volumes/eSIsAwAAQBAJ", volumeInfo: {…}, …}1: {kind: "books#volume", id: "LpctBAAAQBAJ", etag: "DoHITbafozc", selfLink: "https://www.googleapis.com/books/v1/volumes/LpctBAAAQBAJ", volumeInfo: {…}, …}2: {kind: "books#volume", id: "Wmfr1Zp7d5EC", etag: "R1DNX3Ho1hU", selfLink: "https://www.googleapis.com/books/v1/volumes/Wmfr1Zp7d5EC", volumeInfo: {…}, …}3: {kind: "books#volume", id: "PXa2bby0oQ0C", etag: "2NYLWaSh5Wc", selfLink: "https://www.googleapis.com/books/v1/volumes/PXa2bby0oQ0C", volumeInfo: {…}, …}4: {kind: "books#volume", id: "ptiYBAAAQBAJ", etag: "mpwwx7aWosM", selfLink: "https://www.googleapis.com/books/v1/volumes/ptiYBAAAQBAJ", volumeInfo: {…}, …}length: 5__proto__: Array(0)
Комментарии:
1. Во что ты влез
gbaSearchObject.items
иgbaSearchObject.items
? поместите консоль. войдите в журнал перед циклами forEach и почему вы вызывали его два раза2. Привет, Грег, я не знаком с обертыванием циклов forEach в console.log. Я вызвал его дважды, так как на данный момент это единственный известный мне способ вызывать их в отдельных функциях.
3. не оборачивая, просто поместите
console.log(gbaObject.items)
передgbaObject.items.forEach...
тем, как вы должны увидеть в журнале консоли массив json элементов4. Спасибо, Грег. Когда я выполняю эти задания, я делаю заметки о том, что нужно изучить глубже. Я сделал консоль. войдите в оба объекта, и я получаю результаты только из кода книжной полки. Я отредактировал свой оригинальный пост, чтобы добавить консоль. выходы журнала.
Ответ №1:
Я решил свою собственную проблему, но хочу поблагодарить @Greg за его помощь. Чтобы решить эту проблему, я создал код книжной полки как собственную функцию, а затем использовал триггер onLoad в теге body для его загрузки. Я также сделал несколько улучшений, таких как скрытие отображения результатов поиска до тех пор, пока не будет выполнен поиск.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lee Baldwin - Milestone 2</title>
<!--import external stylesheet-->
<link href="styles/main.css" rel="stylesheet" />
<!-- import jquery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!--import external javascript-->
<script src="scripts/main.js"></script>
</head>
<body onload="bookshelf()">
<div class="header">
<h1>Lee Baldwin</h1>
<h3>Kennesaw State University Student</h3>
</div>
<div>
<ul>
<li><a href="https://www.leebaldwin.website/Milestone1/leebaldwin_milestone1a.html">Milestone 1a</a></li>
<li><a href="https://www.leebaldwin.website/Milestone1/leebaldwin_milestone1b.html">Milestone 1b</a></li>
<li><a href="leebaldwin_milestone2.html">Milestone 2</a></li>
<li><a href="#">Milestone 3</a></li>
<li><a href="#">Milestone 4</a></li>
</ul>
</div>
<div class="search-bar">
<label for="searchForm">Keywords:</label>
<form method="post" action="javascript:;" id="searchForm" onsubmit="return bookSearch()">
<input type="text" id="q-term" required="required"/>
<button type="submit">Submit</button>
<span id="advanced-search-show"><a href="javascript:;" id="showAdvancedSearch">Advanced Search</a></span>
<span class="search-bar" id="advanced-search">
<label for="maxResults">Max Results:</label>
<select id="maxResults" onchange="bookSearch()">
<option>10</option>
<option>20</option>
<option>30</option>
<option>40</option>
</select>
<label for="goToPage">Go to Page:</label>
<select id="goToPage" onchange="bookSearch()">
<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
<option value="5">6</option>
</select>
</span>
</div>
<div class="grid-container" id="displayBookResults">
<h2>Search Results</h2>
</div>
<h2>My Bookshelf</h2>
<div class="grid-container" id="displayBookshelf">
</div>
</body>
</html>
JS
/*jQuery code to show advanced search bar*/
/*Also hides advanced search link once clicked*/
$(document).ready(function(){
$("#displayBookResults").hide();
$("#advanced-search").hide();
$("#showAdvancedSearch").on('click',function(){
$("#advanced-search-show").hide();
$("#advanced-search").show();
});
});
/*begin bookshelf*/
function bookshelf(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 amp;amp; this.status == 200) {
var gbaObject = JSON.parse(this.responseText);
var gbaHTML = '';
console.log(gbaObject.items);
gbaObject.items.forEach(function (item) {
if (typeof item.volumeInfo.imageLinks != "undefined" amp;amp; item.volumeInfo.imageLinks != null amp;amp; item.volumeInfo.imageLinks != "") {
gbaHTML = `<div class="div200 border" onclick="singleGoogleBooks('` item.id `');">
<div>
<img src="` item.volumeInfo.imageLinks.smallThumbnail `" alt="` item.volumeInfo.title `" title="` item.volumeInfo.title `"/>
<div class="title"><strong>Title:</strong> ` item.volumeInfo.title `</div>
</div>
</div>`;
}
});
$('#displayBookshelf').html(gbaHTML);
}
};
xmlhttp.open("GET", "https://www.googleapis.com/books/v1/users/115951386289303716892/bookshelves/1001/volumes?startIndex=0amp;maxResults=10", true);
xmlhttp.send();
}
/*end bookshelf*/
/*begin booksearch*/
function bookSearch() {
var term = $("#q-term").val();
var maxResults = parseInt($("#maxResults").val());
var goToPage = parseInt($("#goToPage").val());
var startIndex = parseInt(goToPage) * parseInt(maxResults);
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 amp;amp; this.status == 200) {
var gbaSearchObject = JSON.parse(this.responseText);
var gbaSearchHTML = '';
console.log(gbaSearchObject.items);
gbaSearchObject.items.forEach(function (item) {
if (typeof item.volumeInfo.imageLinks != "undefined" amp;amp; item.volumeInfo.imageLinks != null amp;amp; item.volumeInfo.imageLinks != "") {
gbaSearchHTML = `<div class="div200 border" onclick="singleGoogleBooks('` item.id `');">
<div>
<img src="` item.volumeInfo.imageLinks.smallThumbnail `" alt="` item.volumeInfo.title `" title="` item.volumeInfo.title `"/>
<div class="title"><strong>Title:</strong> ` item.volumeInfo.title `</div>
</div>
</div>`;
}
});
$("#displayBookResults").show();
$('#displayBookResults').html(gbaSearchHTML);
}
};
xmlhttp.open("GET", "https://www.googleapis.com/books/v1/volumes?q=" term "amp;startIndex=" startIndex "amp;maxResults=" maxResults "", true);
xmlhttp.send();
return false;
}
/*end booksearch*/
/*send user to details page onclick of results (PDP)*/
function singleGoogleBooks(bid) {
window.location.href = '/single-google-books/?bid=' bid '';
}
/*end PDP*/