我在使用JavaScript定位动态创建的元素时遇到了一些问题。
缩短的JavaScript代码:
var lightbox = document.createElement('div'),
nav = document.createElement("nav"),
imga = document.querySelectorAll(".gallery a");
for (i = 0; i < imga.length; i++) {
imga[i].addEventListener("click", function() {
document.body.insertBefore(lightbox, document.body.firstChild);
lightbox.appendChild(nav);
});
}
1:现在我想在我的<nav>
上举办活动。如何让活动定位到#lightbox nav a
,而不仅仅是#lightbox nav
?
nav.addEventListener("click", function() {
// works, but I want to target only the <a> links inside
});
我尝试过很多东西,比如:
var selector = document.querySelectorAll("nav a");
for (i = 0; i < selector.length; i++) {
selector[i].addEventListener("click", function() {
// doesn't work because the <nav> is inserted dynamically
});
}
而且:
var selector = nav.getElementsByTagName("a");
for (i = 0; i < selector.length; i++) {
selector[i].addEventListener("click", function() {
// doesn't work because the <nav> is inserted dynamically
});
}
缩短的JavaScript代码:
var img,
imga = document.querySelectorAll(".gallery a");
for (i = 0; i < imga.length; i++) {
imga[i].addEventListener("click", function() {
for (i = 0; i < imga.length; i++) {
img = document.createElement("img");
lightbox.appendChild(img);
}
});
}
2:如何向动态创建的#lightbox img
添加事件? img = document.createElement("img")
必须在函数内部附加多个图像,因此我不能这样做(就像当前在<nav>
上一样):
img.addEventListener("click", function() {
// doesn't work because img = document.createElement("img")
// has to be inside another function
});
有人可以帮我这个吗?我在JavaScript方面经验不足。
答案 0 :(得分:3)
简单的解决方案是将事件处理程序添加到循环内的所有元素
var img,
imga = document.querySelectorAll(".gallery a");
for (i = 0; i < imga.length; i++) {
imga[i].addEventListener("click", function() {
for (i = 0; i < imga.length; i++) {
img = document.createElement("img");
img.setAttribute("src", imga[i].getAttribute("href"));
lightbox.appendChild(img);
img.addEventListener('click', fn, false);
}
});
}
更难的解决方案是使用委托事件处理程序
var img,
imga = document.querySelectorAll(".gallery a");
lightbox.addEventListener('click', function(e) {
if ( e.target.nodeType.toLowerCase() === 'img' ) {
// do stuff
}
}, false);
for (i = 0; i < imga.length; i++) {
imga[i].addEventListener("click", function() {
for (i = 0; i < imga.length; i++) {
img = document.createElement("img");
img.setAttribute("src", imga[i].getAttribute("href"));
lightbox.appendChild(img);
}
});
}
可以像上面一样使用委托事件处理程序
来解决nav.addEventListener("click", function(e) {
if ( e.target.nodeType.toLowerCase() === 'a' ) {
// an achor was clicked, do stuff
}
});
答案 1 :(得分:0)
就我而言,解决方案并不太难。随着@adeneo让我考虑嵌套事件处理程序,它结果很好 - 我能够使用我的所有选择器而不做任何修改:
var lightbox = document.createElement('div'),
nav = document.createElement("nav"),
imga = document.querySelectorAll(".gallery a"),
gallery = document.getElementsByClassName("gallery"),
img;
for (i = 0; i < imga.length; i++) {
imga[i].addEventListener("click", function() {
lightbox.appendChild(nav);
document.body.insertBefore(lightbox, document.body.firstChild);
for (i = 0; i < imga.length; i++) {
img = document.createElement("img");
lightbox.appendChild(img);
}
lightbox.addEventListener("click", function() {
// works fine
});
var nava = document.querySelectorAll("#lightbox nav a");
for (i = 0; i < nava.length; i++) {
nava[i].addEventListener("click", function() {
// works fine
});
}
var limg = document.querySelectorAll("#lightbox img");
for (i = 0; i < limg.length; i++) {
limg[i].addEventListener("click", function() {
// works fine
});
}
});
}