为了账号安全,请及时绑定邮箱和手机立即绑定

在 JS 中使用选择字段过滤元素时出现问题

在 JS 中使用选择字段过滤元素时出现问题

翻阅古今 2023-07-14 14:50:19
我正在开发一种图片管理应用程序,并且有一个具有过滤图片功能的部分。我有 3 个输入字段:2 个选择框(一个用于选择位置,另一个用于选择事件)和一个日期选择器。我将图片包装在Photo()对象中,其中包括图片的路径、日期、事件和位置。我希望它的工作方式是:如果您选择一个位置,则具有该位置的所有图片都会显示在预览中,但如果您还选择一个事件,则具有该位置和事件的所有图片(同时)将显示在预览中,并且以同样的方式,如果您选择一个日期,则将选择(同时)具有该日期、事件和地点的所有图片。这是我的这部分的 HTML:<div id="newAlbumExtraDetails">     <a>Filter:</a>    <select id="newAlbumLocation" onchange="previewUpdater('subsequent')">        <option value="" disabled selected hidden>Localization...</option>    </select>    <select id="newAlbumEvent" onchange="previewUpdater('subsequent')">        <option value="" disabled selected hidden>Event...</option>    </select>    <input type="date" id="newAlbumDate" name="newAlbumDate" onchange="previewUpdater('subsequent')">    <button type="button" class="formButton"  id="saveAlbumButton" onclick="saveAlbum()">Save Album</button>    <button type="button" class="formButton"  id="discardAlbumButton" onclick="goBack()">Discard Album</button>    </div>我的 JS 函数的一部分previewUpdater():function previewUpdater(scope){    let counter = document.querySelector("#previewPhotoCounter")    let previewBox = document.querySelector("#photosPreview")    let locationSelector = document.querySelector("#newAlbumLocation")    let eventSelector = document.querySelector("#newAlbumEvent")    let dateSelector = document.querySelector("#newAlbumDate")        counter.innerHTML = currentPhotos.length    // This "initial" part of the function is used to fill the preview box with    // all the pictures when this filtering area is first visited, it's not very    // relevant regarding the question.    if (scope == "initial") {        fillOptions()        for (let i = 0; i < currentPhotos.length; i++) {            let newDiv = document.createElement("div")            let newImg = document.createElement("img")        }}我只能想办法显示具有该位置或事件或日期的所有图片,或者具有该位置的所有图片和具有该事件的所有图片以及具有该日期的所有图片(重复)。预先感谢,我已经看了几个小时了,最后承认失败。
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您需要一个过滤功能来考虑所有可用的过滤器。像这样的东西:


if (scope=="subsequent") {

  const defaultLocation = "Localization...";

  const defaultEvent = "Event...";

  const defaultDate = "";


  // Remove photos that were already there

  while (previewBox.lastElementChild) {

      previewBox.removeChild(previewBox.lastElementChild);

  }


  // Getting data from the select fields and date picker

  let selectedLocation = locationSelector.options[locationSelector.selectedIndex].text;

  let selectedEvent = eventSelector.options[eventSelector.selectedIndex].text;

  let selectedDate = dateSelector.value


  for (let i = 0; i < currentPhotos.length; i++) {

    let currentPicture = currentPhotos[i];

  

    // This is currently doing nothing, it's just my way of knowing if the select fields

    // and date picker have been selected or are in their default values:

    if (selectedLocation != "Localization..." || selectedEvent != "Event..." || selectedDate != "" ) {

        console.log("selected!")

    }


    if((selectedLocation == defaultLocation || currentPicture.location == selectedLocation) && 

       (selectedEvent == defaultEvent || currentPicture.event == selectedEvent) && 

       (selectedDate == defaultDate || currentPicture.date == selectedDate)) {


        let newDiv = document.createElement("div");

        let newImg = document.createElement("img");

            

        // From here on it's simply adding the pictures to the preview box

        newImg.setAttribute("src", currentPhotos[i].path);

        newImg.addEventListener("click", openPhotoViewer)

    

        newDiv.appendChild(newImg)

        previewBox.appendChild(newDiv)

    }

  }

}


查看完整回答
反对 回复 2023-07-14
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信