gpt4 book ai didi

javascript - 检查元素是否具有单击另一个元素的类并运行函数

转载 作者:行者123 更新时间:2023-11-30 15:35:10 24 4
gpt4 key购买 nike

Vanilla JS。如果 body 标签的类别为 example,则尝试在单击元素时运行函数.没有 jQuery请解决方案,我来自jQuery并想在 JavaScript 中学习和理解这个简单的任务.

如果你想告诉我更多,请问我的想法错误在哪里?我需要包装 onclick 吗? body 类条件内的事件? Tried that but also not getting the alert .

    var imgContainer = document.querySelector('.img-container');

var bodyTag = document.getElementsByTagName('body');

var bodyClassName = bodyTag.classname;

imgContainer.onclick = infoBox;

function infoBox(event) {

if (bodyTag.classList.contains("example")) {

alert('img-container has been clicked');

}
}
<body class="example">
<div class="img-container">
<img src="https://dummyimage.com/320x120/000/fff" alt="dummy image">
<div class="img-infobox">
<p>This is a dummy image from https://dummyimage.com/</p>
</div>
</div>
</body>

编辑
根据给定的答案,我认为与其返回像对象这样的数组并查询 DOM,不如只返回 document.body 是最快的。 .没有?

这意味着这个问题与

What do querySelectorAll, getElementsByClassName and other getElementsBy* methods return?

https://stackoverflow.com/users/949476/dfsq 的评论提供的答案以来不使用链接答案中的任何一种方法。

还有
如何比较使用 document.querySelector 的速度与 document.getElementsByTagName('body')[0];document.body好吗?

想解释一下为什么我接受了公平的答案,因为所有答案都提供了可行的解决方案。

回答
由于所有答案都有效并且 document.body is fastest但还有另一个原因,我喜欢在这里发布我的答案。

我正在使用来自 "4 novel ways to deal with sticky :hover effects on mobile devices" 的脚本处理粘性悬停问题。有了这个,一个类被添加到 html网站的标签。

起初我在条件中有点击函数来检查 body 或 html 类,并且只有在满足类时才触发点击函数,但是使用这个脚本我必须首先运行该函数并且只有一次运行检查 html/body 是否有想要的类。

所以当

  if (bodyTag.classList.contains("example")) {

imgContainer.onclick = infoBox;

function infoBox(event) {
alert('img-container has been clicked and body has class "example"');
}

还有

var bodyClassName = bodyTag.classname;

imgContainer.onclick = infoBox;

function infoBox(event) {

if (bodyTag.classList.contains("example")) {

alert('img-container has been clicked');

}
}

在纯 JSFiddle 中工作,它不适用于此设置,因为一旦进行触摸,粘性悬停脚本就会在元素上设置所需的类。

因此,一旦进行了点击(我假设),检查此触摸/点击/点击事件之外的条件已经太晚了,因此它不会触发。

最后,这导致这些简单的行与粘性悬停脚本一起工作得很好。单击事件必须首先运行,然后检查所需的类/条件。

var imgContainer = document.querySelector('.img-container');

imgContainer.onclick = infoBox;

function infoBox(){

if (document.documentElement.classList.contains('can-touch')) {
alert('click on touch');
}
}

最佳答案

用于选择正文元素的选择器不合适。

getElementsByTagName 将给出类似对象的数组,因此您必须使用索引来获取第一个元素。

阅读:https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName

您已经在使用返回第一个匹配元素的 querySelector,对 body 也做同样的事情。

阅读:https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector

var imgContainer = document.querySelector('.img-container');

var bodyTag = document.querySelector('body');

var bodyClassName = bodyTag.classname;

imgContainer.onclick = infoBox;

function infoBox(event) {

if (bodyTag.classList.contains("example")) {

alert('img-container has been clicked and body has class "example"');

}
}
<body class="example">

<div class="img-container">
<img src="https://dummyimage.com/320x120/000/fff" alt="dummy image">
<div class="img-infobox">
<p>This is a dummy image from https://dummyimage.com/</p>
</div>
</div>

</body>

性能比较:https://jsperf.com/body-selector-comparision

关于javascript - 检查元素是否具有单击另一个元素的类并运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41662790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com