Как я могу получить несколько выходных данных от объекта, используя Javascript в HTML? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь вывести все возможности атрибутов объекта, используя фильтр.Пользователь выбирает платформу и жанр игры и выводит имя, изображение и описание.Если у меня есть несколько игр, которые подпадают под одну и ту же платформу и жанр, я хочу их всех в списке.В консоли они это делают, но когда я вывожу их в HTML-документ, я получаю только имя, изображение и описание в списке.

JavaScript

var games=[{name:'Forza',platform:'xbox',genre:'Racing',descr:'Description',imgr:'forza.jpg'},
{name:'Need For Speed',platform:'xbox',genre:'Racing',descr:'Description',imgr:'nfs.jpg'}

var genre;
var platform;
$("#platformType").change(function(){
    platform=$(this).val()
})
$("#genreType").change(function(){
    genre=$(this).val()
})
$("#Submit").click(function(){games.filter((e)=>e.platform==platform && e.genre==genre?document.getElementById("theGame").innerHTML = e.name:false)})
$("#Submit").click(function(){games.filter((e)=>e.platform==platform && e.genre==genre?document.getElementById("pic").innerHTML = pic.setAttribute("src", e.imgr):false)})
$("#Submit").click(function(){games.filter((e)=>e.platform==platform && e.genre==genre?document.getElementById("desc").innerHTML = e.descr:false)})

HTML:

    <label for="platformType">
        Platform
    </label>
    <select name="platform" id="platformType">
        <option value="PC">(Choose Platform)</option>
        <option value="PC">PC</option>
        <option value="PS4">Playstation 4</option>
        <option value="switch">Switch</option>
        <option value="xbox">Xbox One</option>  
    </select>
    <br />
    <br />

    <label for="genreType">
        Genre
    </label>
    <select name="genre" id="genreType">
        <option value="PC">(Choose Genre)</option>
        <option value="Action">Action/Adventure</option>
        <option value="Fighter">Fighter</option>
        <option value="MMO">MMO</option>
        <option value="MOBA">MOBA</option>
        <option value="OpenWorld">Open World</option>
        <option value="Platformer">Platformer</option>
        <option value="Racing">Racing</option>
        <option value="RPG">RPG</option>
        <option value="Shooter">Shooter</option>
        <option value="Sports">Sports</option>
    </select>
    <br />
    <br />

    <input type="submit" value="Find Game" id="Submit" />

    </br >
        <h1 id="theGame"></h1>
    </br >
        <img id="pic" src="q.jpg"/>
    </br >
        <p id="desc"></p>

1 Ответ

0 голосов
/ 14 февраля 2019

Нечто подобное следующей функции фильтра может быть использовано для достижения вашей цели.В предоставленном вами коде есть несколько проблем, из-за которых код не может выполнить то, что вы хотите.

Обновлен JS:

var games=[
  {name:'Forza',
   platform:'xbox',
   genre:'racing',
   descr:'Description',
   imgr:'forza.jpg'},
  {name:'Need For Speed',
   platform:'xbox',
   genre:'racing',
   descr:'Description',
   imgr:'nfs.jpg'}];

/* make sure you add a default value to these variables to avoid errors since the user could submit the button without selecting anything*/

var genre = 'racing';
var platform = 'xbox';

/* onload function */
$(function(){

/* grabs the array of elements in the HTML document that will be changed */

var gameTitle = $('.theGame');
var gameDesc = $('.desc');
var gamePic = $('.pic');

$("#platformType").change(function(){
  platform=$(this).val()
});

$("#genreType").change(function(){
  genre=$(this).val()
});

/* you only need one 'click' function for '#Submit' */

$("#Submit").click(function(){
console.log(genre, gameTitle, gameDesc, gamePic);
var matchedGames = games.filter((gameObject) => gameObject.genre==genre&&gameObject.platform==platform);

/* clearing out data first */
  for (i=0;i<gameTitle.length;i++) {
    gameTitle[i].innerHTML="";
    gameDesc[i].innerHTML="";
    gamePic[i].src="";
  }

/* then adding the filtered list of games into the page */
  for (i=0;i<matchedGames.length;i++) {
    gameTitle[i].innerHTML=matchedGames[i].name;
    gameDesc[i].innerHTML=matchedGames[i].descr;
    gamePic[i].src=matchedGames[i].imgr;
  }


});


});


Обновлен HTML:

<fieldset>
  <input type="submit" value="Find Game" id="Submit" />
  <select name="filterGame" id="platformType">
    <option value="" disabled class="option1">Select</option>
    <option value="xbox">xBox</option>
    <option value="xbox">Play Station</option>
  </select>
  <select name="filterGame" id="genreType">
    <option value="" disabled class="option1">Select</option>
    <option value="racing">Racing</option>
    <option value="racing">RPG</option>
  </select>
</fieldset>
<!-- added elements to work with the filter function, this can be done a few different ways -->
  <div>
    <h2 class="theGame"></h2>
    <img class="pic" src="">
    <p class="desc"></p>
    <h2 class="theGame"></h2>
    <img class="pic" src="">
    <p class="desc"></p>
    <h2 class="theGame"></h2>
    <img class="pic" src="">
    <p class="desc"></p>
    <h2 class="theGame"></h2>
    <img class="pic" src=""/>
    <p class="desc"></p>
</div>

В JS:

  • filter() возвратмассив, и его нельзя использовать для внесения изменений на странице (например, с помощью .innerHTML),

  • 'false' не нужно явно объявлять (поэтому тернарный оператор isnздесь не требуется), потому что если элемент массива не удовлетворяет требованию, он не будет включен в возвращаемый массив.Это будет удовлетворительным:

var gameArr = games.filter((e)=>e.platform==platform && e.genre==genre);
  • после того, как функция фильтра используется для возврата нового массива (matchedGames), этот массив используется для добавления данных вHTML-элементы, которые я добавил (количество <h2> элементов должно соответствовать общему количеству игр, если вы решите сделать это таким образом

  • вместо того, чтобы кодировать элементы вручную по одномуВы можете использовать метод $ ('body'). append (), чтобы сделать что-то похожее

  • , нет необходимости добавлять игровые данные в элементы <h2> или <p>Вы также можете добавить данные и изображения в таблицу, например, и получить аналогичный результат

  • . Вам также потребуется какой-то способ очистки данных из предыдущих записей при повторной фильтрации пользователя.В играх вы можете использовать цикл for, чтобы выполнить это, я добавил один из приведенных выше в качестве примера

В HTML:

  • Я использовал <h2> элементы вместо <h1> технически должен быть только один <h1> eэлемент на странице, который должен быть заголовком, чтобы сделать вашу страницу удобной для чтения с экрана

Надеюсь, это поможет вам в вашем задании по кодированию!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...