2013-06-25 3 views
1

Я ищу замену img src на hover. Обычно я хотел бы использовать:jQuery on ('hover') Замена события

$('#img').hover(function() { 
    $(this).attr('src', 'http://www.example.com/new-img.jpg'); 
}); 

Однако я загружаю содержание в Ajax с помощью так обычно я хотел бы использовать:

$('#main').on('hover', '#img', function() { 
    $('#img').attr('src', 'http://www.example.com/new-img.jpg'); 
}); 

Но я читал, что («зависание», .. .) был устаревшим в jQuery 1.8 и удален в 1.9 (jQuery Docs), что я и сейчас использую. У кого-нибудь есть какие-либо работы, кроме использования:

$('#main').on('mouseenter', '#img', function() { 
    $('#img').attr('src', 'http://www.example.com/new-img.jpg'); 
}); 

$('#main').on('mouseleave', '#img', function() { 
    $('#img').attr('src', 'http://www.example.com/old-img.jpg'); 
}); 
+2

, что является проблемой при использовании MouseEnter и MouseLeave? –

+0

Нет проблем с этим, я просто смотрю, есть ли у кого-то более короткое/легкое обходное решение. –

ответ

5

Нет, вам нужно сделать это двумя звонками. Но для добавленных точек JQuery, вы можете приковать их:

$('#main').on('mouseenter', '#img', function() { 
    $('#img').attr('src', 'http://www.example.com/new-img.jpg'); 
}).on('mouseleave', '#img', function() { 
    $('#img').attr('src', 'http://www.example.com/old-img.jpg'); 
}); 

И как Benjamin комментарии ниже, вы можете оптимизировать дальше (вы получите простой старый JavaScript очков времени):

$('#main').on('mouseenter', '#img', function() { 
    this.src = 'http://www.example.com/new-img.jpg'; 
}).on('mouseleave', '#img', function() { 
    this.src = 'http://www.example.com/old-img.jpg'; 
}); 
+2

«Добавлено jQuery points», заставил меня усмехнуться. – casraf

+0

цепочка в этом случае имеет меньше смысла, а просто передает несколько событий в один вызов '.on()'. Как и в ответе Шаддова. – kmfk

+3

@kmfk Но этот способ не поддерживает делегирование событий. «Я загружаю содержимое через Ajax» – lonesomeday

2

можно применить несколько события и затем проверить event.type так:

$('#main').on('mouseenter mouseleave', '#img', function(e) { 
    $(this).attr('src', 'http://www.example.com/' + (e.type == 'moseenter' ? 'new-img.jpg' : 'old-img.jpg')); 
}); 

jsFiddle

Вы можете также использовать switch-case или if/else:

$('#main').on('mouseenter mouseleave', '#img', function(e) { 
    switch(e.type) { 
     case 'mouseenter': 
      $(this).attr('src', 'http://www.example.com/new-img.jpg'); 
      break; 
     case 'mouseleave': 
      $(this).attr('src', 'http://www.example.com/old-img.jpg'); 
      break; 
    } 
} 
1

Вот альтернативный подход, который не требует никаких JavaScript вообще:

Вместо использования <img> с src атрибут использовать DIV, дайте что Див тот же идентификатор (не забудьте указать ему нужную ширину и высоту).

В вашем CSS, дайте что divbackground-image что-то вроде:

#img{ 
    background-image: url('http://www.example.com/old-img.jpg'); 
} 

О :hover изменении его

#img:hover{ 
    background-image: url('http://www.example.com/new-img.jpg'); 
} 

(fiddle)

+0

Ну, если бы я хотел использовать CSS, я бы просто создал спрайт и изменил «background-position» для более быстрого времени загрузки;). Но это было скорее любопытством. –

+2

@pennstate_fanboy А, ок, я думал, что вы не знали об этой технике. Это предпочтительнее опции jQuery, если вы просто меняете источник изображения. Особенно с делегацией. –

+0

Правда, как я уже сказал, больше всего любопытство. У меня есть еще несколько событий, которые срабатывают при одном и том же «зависании», поэтому я решил, что просто выброшу img src в него. –