Jquery“.on”函数 - 在 .on 数组中的特定事件上使用多个 Selectors/Elements
Jquery ".on" Function - Using Multiple Selectors/Elements on Specific Events in an .on Array
首先让我说,很抱歉标题的措辞令人困惑,我不确定如何陈述我的问题。
我正在使用 jQuery“.on”函数来处理特定 element/selector (.custom-video-image) 的三个事件,如下所示:
$('.custom-video-image').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
如您所见,“.custom-video-image”有三个事件。但是,我想向这个函数添加多个 elements/selectors 但不是全局的。例如,我不想将这三个事件附加到附加的 elements/selectors,这将像这样实现:
$('.custom-video-image, .selector-2, .selector-3').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
我想要实现的是将另外两个 elements/selectors 应用于 "mouseover" 和 "mouseout" 事件。 以下代码仅用于说明目的 - 这就是我想要实现的目标:
$('.custom-video-image').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
$('.custom-video-image, .selector-2, .selector-3').on({
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
$('.custom-video-image, .selector-2, .selector-3').on({
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
同样,我知道最后一个代码示例不起作用,我只是想说明我试图在一个“.on”函数中实现什么——如果可能的话。
最后,我知道我可以通过创建多个“.on”函数调用或各种其他方法来实现这一点,但我想看看是否可以使用此方法为特定事件指定额外的 elements/selectors一个“.on”函数。
非常感谢任何帮助,如果有替代解决方案来减少所需的代码行数以达到相同的效果,我会洗耳恭听!只是想学习更有效和高效的方法。
谢谢。
编辑 1:如果没有替代解决方案,我将采用以下解决方案(我愿意接受任何改进以下代码的建议):
$('.custom-video-image').on({
'click': function () {
video = '<iframe src="' + $(this).attr('data-video') + '"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
}
});
$('.custom-video-image, .custom-play, .banner-overlay__copy').on({
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
可以使用单个事件处理程序并根据事件类型和目标执行条件操作。请注意 on()
passes your handler an Event object, from which you can determine the event's type and target.
在下面的示例中,我使用 switch 语句来定义各种条件下的操作。
我认为这对具有复杂逻辑或动态功能的处理程序很有用。除了这些好处,单独调用 on()
可以说更具可读性和更易于维护。
$('.s1,.s2,.s3').on('click mouseover mouseout', function(e) {
var $eventTarget = $(e.target),
eventType = e.type;
switch (true) {
case $eventTarget.hasClass('s1') && eventType == 'click':
$eventTarget.toggleClass('red');
break;
case $eventTarget.hasClass('s2') && $.inArray(eventType,['mouseover','mouseout'])>=0:
$eventTarget.toggleClass('green');
break;
case $eventTarget.hasClass('s3') && $.inArray(eventType,['mouseover','mouseout'])>=0:
$eventTarget.toggleClass('blue');
break;
default:
}
});
.red { background-color: red;}
.green { background-color: lightgreen;}
.blue { background-color: lightblue;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="s1">ELEMENT 1</div>
<div class="s2">ELEMENT 2</div>
<div class="s3">ELEMENT 3</div>
正如我的一条评论中提到的,我打算测试让 $('.selector-1, .selector-2, .selector-3).on({... 并确定哪个基于元素触发的事件。我设计了一个解决方案,但是,与两个 switch 语句或两个单独的“.on”事件相比,我不确定它是否会对性能或任何其他方面有好处。
这是我想出的解决方案:
$('.custom-video-image, .custom-play, .banner-overlay__copy').on({
'click': function() {
if($(this).is('.custom-play, .custom-video-image')) {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
}
},
'mouseover': function() {
if($(this).is('.custom-play')) {
$(this).attr("src","images/youtube-play-color.png");
} else {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
}
},
'mouseout': function() {
if($(this).is('.custom-play')) {
$(this).attr("src","images/youtube-play-dark-trans.png");
} else {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
}
});
我所做的只是 运行 一张支票,上面写着 "if selector-'x'" 所有三个事件。
这已经过测试并且工作正常,但希望任何可用的输入,以了解哪种解决方案最适合 performance/code 清晰度。谢谢
首先让我说,很抱歉标题的措辞令人困惑,我不确定如何陈述我的问题。
我正在使用 jQuery“.on”函数来处理特定 element/selector (.custom-video-image) 的三个事件,如下所示:
$('.custom-video-image').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
如您所见,“.custom-video-image”有三个事件。但是,我想向这个函数添加多个 elements/selectors 但不是全局的。例如,我不想将这三个事件附加到附加的 elements/selectors,这将像这样实现:
$('.custom-video-image, .selector-2, .selector-3').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
我想要实现的是将另外两个 elements/selectors 应用于 "mouseover" 和 "mouseout" 事件。 以下代码仅用于说明目的 - 这就是我想要实现的目标:
$('.custom-video-image').on({
'click': function() {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
},
$('.custom-video-image, .selector-2, .selector-3').on({
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
$('.custom-video-image, .selector-2, .selector-3').on({
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
同样,我知道最后一个代码示例不起作用,我只是想说明我试图在一个“.on”函数中实现什么——如果可能的话。
最后,我知道我可以通过创建多个“.on”函数调用或各种其他方法来实现这一点,但我想看看是否可以使用此方法为特定事件指定额外的 elements/selectors一个“.on”函数。
非常感谢任何帮助,如果有替代解决方案来减少所需的代码行数以达到相同的效果,我会洗耳恭听!只是想学习更有效和高效的方法。
谢谢。
编辑 1:如果没有替代解决方案,我将采用以下解决方案(我愿意接受任何改进以下代码的建议):
$('.custom-video-image').on({
'click': function () {
video = '<iframe src="' + $(this).attr('data-video') + '"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
}
});
$('.custom-video-image, .custom-play, .banner-overlay__copy').on({
'mouseover': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
},
'mouseout': function() {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
});
可以使用单个事件处理程序并根据事件类型和目标执行条件操作。请注意 on()
passes your handler an Event object, from which you can determine the event's type and target.
在下面的示例中,我使用 switch 语句来定义各种条件下的操作。
我认为这对具有复杂逻辑或动态功能的处理程序很有用。除了这些好处,单独调用 on()
可以说更具可读性和更易于维护。
$('.s1,.s2,.s3').on('click mouseover mouseout', function(e) {
var $eventTarget = $(e.target),
eventType = e.type;
switch (true) {
case $eventTarget.hasClass('s1') && eventType == 'click':
$eventTarget.toggleClass('red');
break;
case $eventTarget.hasClass('s2') && $.inArray(eventType,['mouseover','mouseout'])>=0:
$eventTarget.toggleClass('green');
break;
case $eventTarget.hasClass('s3') && $.inArray(eventType,['mouseover','mouseout'])>=0:
$eventTarget.toggleClass('blue');
break;
default:
}
});
.red { background-color: red;}
.green { background-color: lightgreen;}
.blue { background-color: lightblue;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="s1">ELEMENT 1</div>
<div class="s2">ELEMENT 2</div>
<div class="s3">ELEMENT 3</div>
正如我的一条评论中提到的,我打算测试让 $('.selector-1, .selector-2, .selector-3).on({... 并确定哪个基于元素触发的事件。我设计了一个解决方案,但是,与两个 switch 语句或两个单独的“.on”事件相比,我不确定它是否会对性能或任何其他方面有好处。
这是我想出的解决方案:
$('.custom-video-image, .custom-play, .banner-overlay__copy').on({
'click': function() {
if($(this).is('.custom-play, .custom-video-image')) {
video = '<iframe src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).siblings('.custom-play').css('display', 'none');
$(this).parent().toggleClass("image-wrapper video-wrapper");
$(this).replaceWith(video);
}
},
'mouseover': function() {
if($(this).is('.custom-play')) {
$(this).attr("src","images/youtube-play-color.png");
} else {
$(this).siblings('.custom-play').attr("src","images/youtube-play-color.png");
}
},
'mouseout': function() {
if($(this).is('.custom-play')) {
$(this).attr("src","images/youtube-play-dark-trans.png");
} else {
$(this).siblings('.custom-play').attr("src","images/youtube-play-dark-trans.png");
}
}
});
我所做的只是 运行 一张支票,上面写着 "if selector-'x'" 所有三个事件。
这已经过测试并且工作正常,但希望任何可用的输入,以了解哪种解决方案最适合 performance/code 清晰度。谢谢