gpt4 book ai didi

javascript - 如何在 jQuery 中形式化/组织大量的 eventHandler?

转载 作者:行者123 更新时间:2023-11-30 11:50:53 25 4
gpt4 key购买 nike

我是 JavaScript 的新手,不知道如何编写大量的事件处理程序代码,例如 mouseover/mouseout

假设我必须在页面上键入元素。每个元素都应该触发一个特定的事件。我是否必须为每个元素编写每个函数的代码,或者有一种方法可以将其抽象化,以便它们由另一个函数生成。

这是一个包含两个元素的两个列表的示例,但是我考虑的是每个列表有数百个元素的情况。

<!-- List 1 -->
<div id="a">the A</div>
<div id="b">the B</div>
<!-- List 2 -->
<div id="i">the I</div>
<div id="j">the J</div>

<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script>
$( '#a' )
.mouseover(function() {
$( '#i' ).css("color", "red")
})
.mouseout(function() {
$( '#i' ).css("color", "black")
})

$( '#b')
.mouseover(function() {
$( '#j' ).css("color", "red")
})
.mouseout(function() {
$( '#j' ).css("color", "black")
})

$( '#j')
.mouseover(function() {
$( '#a' ).css("color", "red")
$( '#i' ).css("color", "red")
})
.mouseout(function() {
$( '#a' ).css("color", "black")
$( '#i' ).css("color", "black")
})
</script>

我怎样才能简单地使用这样的数组来表示我想要的交互:

var todo = [
[a, [i]],
[b, [j]],
[j, [a, i]]
]

还有一个可以同时实现它们的函数:

makeAllMouseover(todo)

我想我遗漏了一些关于 html/js 的非常明显的东西,但我无法弄清楚是什么/为什么......

最佳答案

只要您的 todo 数组不改变格式,下面的内容就可以动态地处理您向它抛出的任何内容。

var todo = [
['a', ['i']],
['b', ['j']],
['j', ['a', 'i']]
];

todo.forEach(function(el) { // Loop through the array
$('#' + el[0]).hover(function() { // MouseIn
$('#' + el[1].join(', #')).addClass('makeRed'); // Stringify the targets to add the class
}, function() { // MouseOut
$('#' + el[1].join(', #')).removeClass('makeRed'); // Stringify the targets to remove the class
});
});
div {
border-bottom: 1px solid black;
color: black;
}

.makeRed {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="listContainer">
<!-- List 1 -->
<div id="a">the A</div>
<div id="b">the B</div>
<!-- List 2 -->
<div id="i">the I</div>
<div id="j">the J</div>

JamieC 提出了关于不使用 ID 来定位事件处理程序的有效观点。我建议更进一步并使用 event delegation所以只有一个监听器被添加到页面,而不是为每个元素添加多个:

var todo = [
['a', ['i']],
['b', ['j']],
['j', ['a', 'i']]
];

function hoverText(id, isIn) {
// Filter the array to just contain the one we've clicked
var elements = todo.filter(function(value) {
return id === value[0]
})[0];

// If the array is found, add/remove the class to/from the target elements
if (elements) {
elements = $('#' + elements[1].join(', #'));
if (isIn) {
elements.addClass('makeRed');
} else {
elements.removeClass('makeRed');
}
}
}

/**
* Add event listener to the nearest element that surrounds all list items
* Delegate the action to the list item(s).
*/
$('.listContainer').on('mouseenter', '.listItem', function(event) {
hoverText(event.target.id, true)
}).on('mouseleave', '.listItem', function(event) {
hoverText(event.target.id, false)
});
.listContainer .listItem {
border-bottom: 1px solid black;
color: black;
}
.listContainer .listItem.makeRed {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="listContainer">
<!-- List 1 -->
<div class="listItem" id="a">the A</div>
<div class="listItem" id="b">the B</div>
<!-- List 2 -->
<div class="listItem" id="i">the I</div>
<div class="listItem" id="j">the J</div>
</div>

关于javascript - 如何在 jQuery 中形式化/组织大量的 eventHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39514762/

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