单击事件侦听器方法不适用于特定的 div
Posted
技术标签:
【中文标题】单击事件侦听器方法不适用于特定的 div【英文标题】:click event listener method is not working on a specific div 【发布时间】:2022-01-11 03:58:00 【问题描述】:我正在尝试向我的“学位部分 div”添加一个事件侦听器,但它不起作用,我也没有收到任何错误。我尝试了多种遍历 DOM 以到达“度数部分”div 的方法,但无济于事。
欢迎和感谢任何形式的帮助
代码:
let city = document.querySelector('#city');
let searchbtn = document.querySelector('.search-btn');
let city_name = document.querySelector('.city-name');
let temp = document.querySelector('.temp');
let feels_like = document.querySelector('.feels-like');
let humidity = document.querySelector('.humidity');
let locationIcon = document.querySelector('.weather-icon');
let checkbox = document.getElementById('celcius');
let weather_sec = document.querySelector('.weather-info');
let degree_section = weather_sec.firstElementChild;
let degree_section_span = degree_section.getElementsByTagName('span')[0];
//let wind = document.querySelector('.wind');
async function getUrl(city)
try
let theUrl = url + city + '&appid=' + apiKey;
let response = await fetch(theUrl,
mode: 'cors'
)
let data = await response.json();
//Get data from api and change html content based on the recieved data
let temp_data = data.main.temp
temp.textContent = temp_data;
let feels_like_data = data.main.feels_like;
feels_like.textContent = feels_like_data + "K";
let humidity_data = data.main.humidity;
humidity.textContent = humidity_data;
let
icon
= data.weather[0];
locationIcon.innerHTML = `<img src="icons/$icon.png">`;
//change K to C
degree_section.addEventListener('click', () =>
//logging a message just to check if it is working
console.log("c")
)
catch (err)
let error = document.createElement('span')
error.className = "error";
error.textContent = "Location does not exist"
let top_center_div = document.querySelector('.top-center')
top_center_div.appendChild(error)
city_name.textContent = "No city found"
searchbtn.addEventListener('click', (e) =>
let cityName = city.value;
city_name.textContent = cityName
console.log(cityName)
getUrl(cityName)
)
<body>
<div class="loc-container">
<div class="location">
<h1 class="city-name">City</h1>
<div class="weather-icon"><img src="icons/unknown.png" /></div>
</div>
</div>
<div class="weather-info">
<div class="degree-section">
<h2 class="temp">0.0</h2>
<span>K</span>
</div>
<div class="info-section">
<div class="info-flex">
<h3 class="feels-like">0K</h3>
<h4>Feels Like</h4>
</div>
<div class="info-flex">
<h3 class="humidity">0</h3>
<h4>Humidity</h4>
</div>
<div class="info-flex">
<h3 class="wind">0</h3>
<h4>Wind</h4>
</div>
</div>
</div>
<div class="top-center">
<div class="form">
<input type="text" name="city" id="city" required>
<label for="city" class="label-name"><span class="search-name">Search City...</span></label>
</div>
<!-- <i class="fas fa-search search-btn"></i> -->
<i class="material-icons search-btn" style="font-size: 35px;">search</i>
</div>
<script src="weather.js"></script>
</body>
这就是“数据”的样子
"coord":"lon":72.8479,"lat":19.0144,"weather":["id":711,"main":"Smoke","description":"smoke","icon":"50d"],"base":"stations","main":"temp":303.14,"feels_like":303.45,"temp_min":301.09,"temp_max":303.14,"pressure":1014,"humidity":45,"visibility":2500,"wind":"speed":3.09,"deg":120,"clouds":"all":20,"dt":1638773692,"sys":"type":1,"id":9052,"country":"IN","sunrise":1638754125,"sunset":1638793848,"timezone":19800,"id":1275339,"name":"Mumbai","cod":200
提前谢谢你!
【问题讨论】:
好吧,它只在您成功获取数据时才有效,因为您使用的是getUrl
中的事件侦听器。但是,我认为这没有任何意义。为什么你只是不使用 out 函数?
你能编辑你的问题并显示data
的样子吗?
@Engin 我也试过了,但还是不行
@JackFleeting 确定!
【参考方案1】:
我认为问题出在
let degree_section_span = degree_section.getElementsByTagName('span')[0];
因为它选择了错误的元素。尝试将其更改为
let degree_section_span = weather_sec.querySelector('.check');
看看它是否有效。您还可以将变量名称更改为更合适的名称。
编辑:
我认为这就是你想要做的。为了简单起见,我删除了与 temp 无关的所有内容:
let target = weather_sec.querySelector("div.check"),
temp_data = data.main.temp;
temp.textContent = temp_data;
target.addEventListener('click', () =>
cel = parseInt(temp_data) - 273.15;
temp.textContent = cel.toFixed(2);
temp.nextElementSibling.textContent = "C";
);
【讨论】:
感谢您的建议。但是,问题在于事件侦听器无法处理由 h2 和 span 元素组成的“degree-section”div。单击学位部分中的元素后,我希望发生一些事情,但它不起作用 @Albert 我想我明白了;您能否编辑您的问题并准确地解释您期望发生什么? 是的!我实际上希望能够单击“度数部分”并将存储在“度数部分> h2”中的温度转换为摄氏度或开尔文。为此,我正在检查事件侦听器是否适用于学位部分 div 的元素,但它没有 @Albert 查看编辑。 首先,我非常感谢您抽出一些时间来提供帮助。我实际上不想要 div.check 但我想要 div.degree-section 因为 h2 在 div.degree-section 中。复选框在那里,因为我正在尝试一种不同的方法。您现在可以忽略 div.check 类。作为参考,我在问题中编辑了我的代码【参考方案2】:因此,经过 48 小时的调试,我终于找出了问题所在。如果您在我的 HTML 中看到,我在底部有一个 div.top-center。由于我的 css 文件中的一些尺寸问题,div.top-center 的高度跨越了整个页面,所以基本上我所有的 div 都被包裹在 div.top-center 中,所以即使我为我的 div.degree 分配了一个点击事件-section 目标始终是 div.top-center ,这就是单击事件未显示正确输出的原因。
【讨论】:
你能edit你的答案显示最终代码吗?以上是关于单击事件侦听器方法不适用于特定的 div的主要内容,如果未能解决你的问题,请参考以下文章
onClick() 事件适用于一个 div,但不适用于另一个。为啥?