【发布时间】:2019-07-27 16:08:48
【问题描述】:
第一次点击没有触发,我不知道为什么。
所有后续点击都可以正常工作。如果我重新加载页面,同样的问题:第一次点击:没有任何反应。
我已经尝试访问其他 html 元素作为 queryselector 中的测试,但这并没有什么不同。
这是代码(我正在尝试在 vanilla JS 中执行此操作):
const cities = [];
fetch(endpoint)
.then(blob => blob.json())
.then(data =>cities.push(...data));
function findMatches(wordToMatch, cities) {
return cities.filter(place => {
const regex = new RegExp(wordToMatch, 'gi');
return place.city.match(regex) || place.state.match(regex)
});
}
function displayMatches() {
const matchArray = findMatches(this.value, cities);
const html = matchArray.map(place => {
const regex = new RegExp(this.value, 'gi');
const cityName = place.city.replace(regex, `<span class="hl">${this.value}</span>`);
const stateName = place.state.replace(regex, `<span class="hl">${this.value}</span>`);
return `
<li>
<span class="name">${cityName}, ${stateName}</span>
<span class="population">${numberWithCommas(place.population)} </span>
</li>
`;
}).join('');
suggestions.innerHTML = html;
// this only works on the second click:
const searchResult = document.querySelectorAll('li');
searchResult.forEach(el => {
el.addEventListener('click', function(){
console.log('hi');
})})
const searchInput = document.querySelector('.search');
const suggestions = document.querySelector('.suggestions');
searchInput.addEventListener('change', displayMatches); // change only fires once user navigates away from input field!
searchInput.addEventListener('keyup', displayMatches);
}
【问题讨论】:
-
第二次点击什么?请注意,在执行
displayMatches之前不要安装点击监听器 -
我想要监听器的html元素是在
displayMatches中生成的。这就是为什么我将它包含在这个函数的底部。是不是找错地方了? -
不,应该没问题。我的意思是,如果
suggestions在页面加载时确实有任何内容,则不会附加任何点击监听器,因为它不是由displayMatches生成的。 -
所以你是说在调试代码的时候,
el.addEventListener被执行了,但是之后点击列表项时,控制台没有出现日志? -
如果我控制台日志
el(或其他任何事情),在第一次点击期间没有任何反应。但是,会记录第二次点击。
标签: javascript