【问题标题】:How to get object properties on element click?如何在元素单击时获取对象属性?
【发布时间】:2019-11-17 05:18:59
【问题描述】:

我正在构建一个用于练习的天气应用程序。我到了这一点,我必须使用来自 JSON 对象的数据创建一个自动完成输入字段。当有人进行输入时,它会显示匹配的数据,但是单击时我想从对象中获取两个属性。我需要从 JSON 对象获取经度和纬度属性以发出 API 请求以返回带有天气数据的对象。内容正确显示,但我无法使 onClick 事件侦听器工作。我尝试了非常不同的事情并且失败了,要么是范围问题,要么是其他问题。这是我的第一个项目之一,我现在正处于垮台。请帮我。 :)

附:你可以在这个链接上找到它:https://objective-edison-1d6da6.netlify.com/

// Testing
const search = document.querySelector('#search');
const matchList = document.querySelector('#match-list');
let states;

// Get states
const getStates = async () => {
  const res = await fetch('../data/bg.json');
  states = await res.json();
};

// Filter states
const searchStates = searchText => {
  // Get matches to current text input
  let matches = states.filter(state => {
    const regex = new RegExp(`^${searchText}`, 'gi');

    return state.city.match(regex);
  });

  // Clear when input or matches are empty
  if (searchText.length === 0) {
    matches = [];
    matchList.innerHTML = '';
  }

  outputHtml(matches);
};

// Show results in HTML
const outputHtml = matches => {
  if (matches.length > 0) {
    const html = matches
      .map(
        match => `<div class="card match card-body mb-1">
    <h4>${match.city} 
    <span class="text-primary">${match.country}</span></h4>
    <small>Lat: ${match.lat} / Long: ${match.lng}</small>
   </div>`
      )
      .join('');
    matchList.innerHTML = html;
    document.querySelector('.match').addEventListener('click', function() {});
    //Wconsole.log(matches);
    //let test = document.querySelectorAll('#match-list .card');
    //const values = matches.values(city);
  }
};

window.addEventListener('DOMContentLoaded', getStates);
search.addEventListener('input', () => searchStates(search.value));

【问题讨论】:

    标签: javascript jquery object events scope


    【解决方案1】:

    如果我理解正确,您正在尝试访问点击匹配的 latlng 值,如果是这种情况,这是一种方法:

    const outputHtml = matches => {
      if (matches.length > 0) {
        const html = matches
          .map(
            match => `<div class="card match card-body mb-1" data-lat="`${match.lat}" data-lng="`${match.lng}">
        <h4>${match.city} 
        <span class="text-primary">${match.country}</span></h4>
        <small>Lat: ${match.lat} / Long: ${match.lng}</small>
       </div>`
          )
          .join('');
        matchList.innerHTML = html;
        document.querySelectorAll('.match').forEach(matchElm => {
          matchElm.addEventListener('click', function(event) {
             const { currentTarget } = event;
             const { lat, lng } = currentTarget.dataset;
          });
        });
      }
    };
    

    我使用data-latdata-lng 属性将所需的值存储在元素的dataset 中,并且我使用document.querySelectorAll('.match') 来获取所有具有match 类的元素,而不仅仅是第一个。

    【讨论】:

    • 天才,谢谢。只有一个小问题,当您单击我们选择的元素内的元素时,它会返回未定义。例如,如果我点击 h4 块,它会返回 undefined,但如果我点击主块,它会返回数据集中的纬度。我想我可以找到解决方案。感谢您启发我了解数据集:)
    • @GeorgeMilev 那是因为event.target 是被点击的元素。我已经编辑了我的答案来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多