【问题标题】:why i can't show data i want when user clicks on button为什么当用户单击按钮时我无法显示我想要的数据
【发布时间】:2020-07-11 11:15:15
【问题描述】:

我正在制作一个简单的搜索自动填充应用程序,用于搜索城市及其信息。

问题是当点击建议时,我希望在不同的 html 元素中显示城市信息。

所以我的 javascript 代码是:

let search=document.getElementById("search");
let searchlist=document.getElementById("searchlist");
search.addEventListener("input",()=>searchcities(search.value));

const searchcities=async searchtext=>{
    var res= await fetch("in.json");
    const cities=await res.json();
    
    
    let matches=cities.filter(city=>{
        const regex=new RegExp(`^${searchtext}`,'gi');
        return city.city.match(regex);
    });
    if(searchtext.length===0){
        matches=[];
        searchlist.innerHTML="";
    }
    outputHTML(matches);
};
function outputHTML(matches){
    if(matches.length>0){
        const html=matches.map(match=>`
        <button class="card" >
        <h4>${match.city}<span class="state ">(${match.admin})</span></h4>
        <small>Latitude: ${match.lat}<br>longitude:${match.lng}</small>
        </button>
        `).join("");
        searchlist.innerHTML=html;
        document.querySelector(".card").addEventListener("click",showresult)
        function showresult(match){
            let result=document.querySelector("#finalresult");
            const show=`
            <div class="result">
            <h4>${match.city}<span class="state ">(match.admin})</span></h4>
            <small>Latitude: ${match.lat}<br>longitude:${match.lng}</small>
            </div>
            `;
            result.innerHTML=show;
            console.log(result);
        }
        }
    
}

我希望这个功能起作用:

function showresult(match){
            let result=document.querySelector("#finalresult");
            const show=`
            <div class="result">
            <h4>${match.city}<span class="state ">(match.admin})</span></h4>
            <small>Latitude: ${match.lat}<br>longitude:${match.lng}</small>
            </div>
            `;
            result.innerHTML=show;
            console.log(result);
        }
        }

但它给了我未定义的数据。我不知道该怎么办。

json文件的结构是这样的:

{ “城市”:“孟买”, “管理员”:“马哈拉施特拉邦”, “国家”:“印度”, "population_proper": "12691836", “iso2”:“输入”, “资本”:“管理员”, “纬度”:“18.987807”, “液化天然气”:“72.836447”, “人口”:“18978000” }

感谢您的帮助。

【问题讨论】:

  • 请在其中包含一个 json 示例。
  • 什么未定义的数据?
  • @PaulT。 undefined 是值。如城市名称、管理员名称等。
  • showresult(match.admin 行)中有一些错字,但这不是您的代码返回未定义的原因。问题在于您职能的另一部分。如果您只是对您的代码进行单元测试,您会注意到它提供了正确的值(在错字之外):showresult({"city": "Mumbai", "admin": "Maharashtra", "country": "India", "population_proper": "12691836", "iso2": "IN", "capital": "admin", "lat": "18.987807", "lng": "72.836447", "population": "18978000"});
  • 问题你是如何测试你的代码的?您使用的是 IDE 还是正确设置了本地主机。获取请求需要导入 json 文件的权限。

标签: javascript html json fetch


【解决方案1】:

你自己让它变得复杂,因为它实际上是什么。您是否考虑过数据属性?这是一个例子:

//Fetch function
const searchCities = async searchText => {
    if(searchText == null) return;

    let matches;
    if(searchText.length < 1) matches = []; //current behaviour will set it to no matches when your removed everything from the input
    else {
        const res = await fetch('js/in.json');
        const cities = await res.json();
        
        matches = await cities.filter(city=>{
            const regex=new RegExp(`^${searchText}`,'gi');
            return city.city.match(regex);
        });
    }

    outputHTML(matches);

};

//Inner function
const outputHTML = (matches) => {
    if(matches == null) return;

    let html = '<p>no matches</p>';
    if(matches.length !== 0) {
        html = matches.map(match => `
        <button class="card" data-city="${match.city}" data-admin="${match.admin}" data-lat="${match.lat}" data-lng="${match.lng}">
        <h4>${match.city}<span class="state ">(${match.admin})</span></h4>
        <small>Latitude: ${match.lat}<br>longitude:${match.lng}</small>
        </button>
        `).join('');
    }

    const searchlist = document.getElementById("searchlist");
    searchlist.innerHTML = html;

    const cards = document.querySelectorAll(".card");
    cards.forEach(card => card.addEventListener("click", showResult));
};

//Click card function
const showResult = (event) => {
    const card = event.currentTarget;
    const result = document.querySelector('#finalresult');
    const cardData = card.dataset;

    const show = `
        <div class="result">
            <h4>${cardData.city}<span class=""state">${cardData.admin}</span></h4>
            <small>Latidude: ${cardData.lat}<br>longitude:${cardData.lng}</small>
        </div>
    `;
    result.innerHTML = show;
};

//Setup
const setup = () => {
    const search = document.getElementById("search");
    search.addEventListener("input",()=>searchCities(search.value));
};

//Load
window.addEventListener('load', setup);
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Indian cities</title>
    <script src="js/main.js"></script>
</head>
<body>
<div class="indian-flag">
    <div class="1"></div>
    <div class="2"></div>
    <div class="3"></div>
</div>
<div class="head">CITIES lookup</div>
<input type="text" name="" id="search" class="input" placeholder="Enter city name...">
<div id="searchlist"></div>
<div id="finalresult"></div>
</body>
</html>

【讨论】:

  • 我对数据属性没有深入的了解,可以推荐学习这个主题的资源吗?谢谢你的帮助。
  • 数据属性只是普通属性之上的一些糖(基本上它只是减少你的代码大小)一个例子:jsfiddle.net/9j3okprs。欲了解更多信息,请访问官方文档:developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/…
  • 在处理 fetch 请求时需要注意的其他事项。实现去抖动以防止将许多请求拉到服务器可能是一个好主意。这是一个实现去抖动的示例:jsfiddle.net/9j3okprs/2
猜你喜欢
  • 2016-04-06
  • 2022-01-19
  • 2020-02-14
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2021-08-13
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多