问题
I am attempting to rewrite a snippet of code using event delegation (in the hopes that it will stop conflict with another snippiet of js). but I've broken the code
Original
//to scale up on hover
var current_h = null;
var current_w = null;
$('.piccon').hover(
function(){
current_h = $(this, 'img')[0].height;
current_w = $(this, 'img')[0].width;
$(this).stop(true, false).animate({width: (current_w * 2.7), height: (current_h * 2.7)}, 900);
},
function(){
$(this).stop(true, false).animate({width: current_w + 'px', height: current_h + 'px'}, 400);
}
);
//using event delegation
//to scale up on hover
var current_h = null;
var current_w = null;
$('#videoandmapwrap').on("hover","img", function(event){
current_h = $(this, 'img')[0].height;
current_w = $(this, 'img')[0].width;
$(this).stop(true, false).animate({width: (current_w * 2.7), height: (current_h * 2.7)}, 900);
},
function(){
$(this).stop(true, false).animate({width: current_w + 'px', height: current_h + 'px'}, 400);
}
event.preventDefault();
);
Reveal from behind Placeholder
//to reveal from behind placeholder picture
$('#videoandmapwrap').on("click","img",function(event){
event.preventDefault();
video = '<iframe class="piccon" width="200" height="200" src="'+ $(this).attr('data-video') +'"></iframe>';
$(this).replaceWith(video);
});
回答1:
The .hover() is not an event it is just a utility method that adds a mouseenter and mouseleave handlers, so when you want to use event delegation you need to register handlers for those 2 events instead of using hover
$(document).on({
mouseenter: function () {
current_h = $(this, 'img')[0].height;
current_w = $(this, 'img')[0].width;
$(this).stop(true, false).animate({
width: (current_w * 2.7),
height: (current_h * 2.7)
}, 900);
},
mouseleave: function () {
$(this).stop(true, false).animate({
width: current_w + 'px',
height: current_h + 'px'
}, 400);
}
}, '.piccon');
Or
$('#videoandmapwrap').on({
mouseenter: function () {
current_h = $(this, 'img')[0].height;
current_w = $(this, 'img')[0].width;
$(this).stop(true, false).animate({
width: (current_w * 2.7),
height: (current_h * 2.7)
}, 900);
},
mouseleave: function () {
$(this).stop(true, false).animate({
width: current_w + 'px',
height: current_h + 'px'
}, 400);
}
}, 'img');
Another way to write the same is
$('#videoandmapwrap').on('mouseenter', function () {
current_h = $(this, 'img')[0].height;
current_w = $(this, 'img')[0].width;
$(this).stop(true, false).animate({
width: (current_w * 2.7),
height: (current_h * 2.7)
}, 900);
}, 'img').on('mouseleave', function () {
$(this).stop(true, false).animate({
width: current_w + 'px',
height: current_h + 'px'
}, 400);
}, 'img');
来源:https://stackoverflow.com/questions/21035809/jquery-event-delegation