[英]Make div in div clickable with Javascript
有问题,无法解决。 试图使用QuerySelectorAll
并将逗号与GetElementsByClassName分隔,但这没有用,所以我想知道如何解决此问题。
我有这个HTML:
<div class="area">Test title
<div class="some content" style="display: none">blablbala
<input></input>
</div>
<div class="two">This should be clickable too</div>
</div>
<div class="area">
Test title
<div class="some content">
blablbala
<input></input>
</div>
<div class="two">This should be clickable too</div>
</div>
JS:
function areaCollapse() {
var next = this.querySelector(".content");
if (this.classList.contains("open")) {
next.style.display = "none";
this.classList.remove("open");
} else {
next.style.display = "block";
this.classList.add("open");
}
}
var classname = document.getElementsByClassName("area");
for (var i = 0; i < classname.length; i++) {
classname[i].addEventListener('click', areaCollapse, true);
}
http://jsfiddle.net/1BJK903/nb1ao39k/6/
CSS:
.two {
position: absolute;
top: 0;
}
因此,现在可以单击类名称为“ area”的div。 我将div定位为绝对“ class”类,现在整个div是可单击的,除了另一个div所在的位置。 如果单击类名称为“ two”的div,则它不起作用(它不会折叠或打开内容)。 如何在不更改结构的情况下完成这项工作?
一种方法是使用全局处理程序,您可以通过检查其ID或类或其他属性或属性来处理多个项。
在以下代码段中找到“ area” div,并将其作为参数传递给areaCollapse
函数。 它还会检查,以便仅在调用areaCollapse
之前单击了two
或area
div(彩色石灰/黄色)。
同样,原始代码还没有添加“ open”类(第二个div组),这意味着需要单击两次,因此我更改了areaCollapse
函数以检查display属性。
function areaCollapse(elem) { var next = elem.querySelector(".content"); if (next.style.display != "none") { next.style.display = "none"; } else { next.style.display = "block"; } } window.addEventListener('click', function(e) { //temp alert to check which element were clicked //alert(e.target.className); if (hasClass(e.target,"area")) { areaCollapse(e.target); } else { //delete next line if all children are clickable if (hasClass(e.target,"two")) { var el = e.target; while ((el = el.parentElement) && !hasClass(el,"area")); if (targetInParent(e.target,el)) { areaCollapse(el); } //delete next line if all children are clickable } } }); function hasClass(elm,cln) { return (" " + elm.className + " " ).indexOf( " "+cln+" " ) > -1; } function targetInParent(trg,pnt) { return (trg === pnt) ? false : pnt.contains(trg); }
.area { background-color: lime; } .two { background-color: yellow; } .area:hover, .two:hover { background-color: green; } .some { background-color: white; } .some:hover { background-color: white; }
<div class="area">Test title clickable 1 <div class="some content" style="display: none">blablbala NOT clickable 1 </div> <div class="two">This should be clickable too 1</div> </div> <div class="area">Test title clickable 2 <div class="some content">blablbala NOT clickable 2 </div> <div class="two">This should be clickable too 2</div> </div> <div class="other">This should NOT be clickable</div>
如果要使用jQuery:
$('.two').click(function(){
//action here
});
绑定classname
,您需要找到two
元素,并且还要绑定它们。
var classname = document.getElementsByClassName("area");
for(var i=0; i < classname.length; i++){
classname[i].addEventListener('click', areaCollapse, true);
var twoEl = classname[i].getElementsByClassName("two")[0];
twoEl.addEventListener('click', function(e) { console.log('two clicked'); });
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.