我试图用javascript实现一个奇怪的边缘情况,但我被卡住了。我想触发一个父母的孩子对另一个父母的孩子的点击,但是孩子应该按照dom树的顺序匹配,因此当用户单击foo2
时,我需要触发对bar2
的点击。 foo3
将触发bar3
,依此类推。
我遇到了一个额外的挑战,因为该数据是从API外部加载的,因此我无法编辑target
的html
var parent = document.querySelector('.parent');
var target = document.querySelector('.target');
parent.addEventListener('click', function(e) {
e.preventDefault;
console.log(e.target);
// clicking a .parent child would trigger a click on
// matching child list-item in .target
// i.e. clicking foo2 would trigger a click on bar2
})
<div class="parent">
<a href="#">foo1</a>
<a href="#">foo2</a>
<a href="#">foo3</a>
<a href="#">foo4</a>
</div>
<ul class="target">
<li>bar1</li>
<li>bar2</li>
<li>bar3</li>
<li>bar4</li>
</ul>
答案 0 :(得分:1)
您可以使用var parentChildren = Array.prototype.slice.call(parent.children)
来获取div parent
的子代
并使用var targetChildren = Array.prototype.slice.call(target.children)
获取ul target
的子代
然后点击parentChildren
中任何元素,就会触发targetChildren
中相同索引的点击
像这样:
var parent = document.querySelector('.parent');
var target = document.querySelector('.target');
var parentChildren = Array.prototype.slice.call(parent.children);
var targetChildren = Array.prototype.slice.call(target.children);
parent.addEventListener('click', function(e) {
e.preventDefault;
targetChildren[parentChildren.indexOf(e.target)].click()
});
// Added this listener for illustration.
target.addEventListener('click', function(e) {
console.log(e.target);
});
<div class="parent">
<a href="#">foo1</a>
<a href="#">foo2</a>
<a href="#">foo3</a>
<a href="#">foo4</a>
</div>
<ul class="target">
<li>bar1</li>
<li>bar2</li>
<li>bar3</li>
<li>bar4</li>
</ul>
答案 1 :(得分:0)
通常,您可以使用href="Javascript: foo()"
在标记中创建触发器(其中foo可以由任何函数替换)。然后,您可以使用document.getElementsByClasses("target")[i].innerHTML
并使用for循环为每个列表中的项设置ID,以为其每个名称提供与它们的名称相关的ID。在函数中,使用document.getElementById("foo")
访问特定的目标列表值。您可以使用document.getElementById("foo").style.(whatever you want)
答案 2 :(得分:0)
事件向上冒泡,因此您将无法通过用户的点击在同级表兄弟元素上捕获同一事件。
但是在事件侦听器内部,当用户单击时,您可以获取要单击的元素,甚至触发它的点击:
function emitEventFrom(thisObservable: boolean): Observable<string> {
return Observable.create(function (observer: Observer<String>) {
if (thisObservable) {
observer.next('thisObservable')
observer.complete()
} else {
// Returning Rx.Observable.of()
of('Other observable').subscribe({
next: (value) => observer.next(value),
error: (error) => observer.error(error)
})
}
})
}