JQuery переключить, чтобы изменить изображение
У меня есть список разделов с изображениями в них:
<div class="wizard-img"><%= image_tag("sources/pix/nyt.png") %></div>
<div class="wizard-img"><%= image_tag("sources/pix/theguardian.png") %></div>
Когда пользователь нажимает на div, я хотел бы, чтобы он изменил изображение на x-on.png, при повторном нажатии он изменится на x-off.png, и когда он будет нажат в третий раз, он должен вернуться к x.png.
Можно ли это сделать без указания вручную jQuery для каждого изменения изображения? Можно ли пересечь div и найти имя изображения, а просто добавить -off/-on к изображению?
Спасибо!
Ответы
Ответ 1
Возможно, CSS спрайты будут работать для вас?
Это избавит вас от загрузки отдельного изображения при каждом нажатии на изображение (кнопка?), и вы можете решить свою проблему, добавив и удалив класс css, например:
$('.wizard-img').click(
function() {
if ($(this).hasClass('on')) {
$(this).removeClass('on').addClass('off');
} else if ($(this).hasClass('off')) {
$(this).removeClass('off');
} else {
$(this).addClass('on');
}
}
);
Ответ 2
http://docs.jquery.com/Events/toggle
$(".wizard-img").toggle(
function () {
$(this).find("img").attr({src:"x-on.png"});
},
function () {
$(this).find("img").attr({src:"x-off.png"});
},
function () {
$(this).find("img").attr({src:"x.png"});
}
);
Ответ 3
CSS Sprites действительно будет способом сделать это, но только для полноты, вот еще один вариант.
Обычно я последний раз для регулярного выражения, но я думаю, что они помогут здесь.
$('.wizard-img').click(function() {
var $img = $(this).find('img') ,
src = $img.attr('src') ,
onCheck = /\-on\.jpg$/ ,
offCheck = /\-off\.jpg$/ ,
normal = /\.jpg$/
;
if(src.match(onCheck)) {
$img.attr('src', src.replace(onCheck, '-off.jpg'));
} else if (src.match(offCheck)) {
$img.attr('src', src.replace(offCheck, '.jpg'));
} else {
$img.attr('src', src.replace(normal, '-on.jpg'));
}
});
Ответ 4
FWIW, я предлагаю вам сделать это, используя простой CSS и background-image
. Мне кажется, что это не обычные изображения, а скорее "кнопки".
Ответ 5
Я нашел этот плагин полезным, чтобы сделать что-то похожее на то, что вы спросили:
http://www.malsup.com/jquery/cycle/
Ответ 6
$('.wizard-img').click(function() {
var img = $(this).find('img');
var src = img.attr('src');
//image is neither on nor off, so change src to on and return
if(src != 'x-on.png' && src != 'x-off.png') {
img.attr('src','x-on.png');
return false;
}
//image is on, so change src to off and return
if(src == 'x-on.png') {
img.attr('src','x-off.png');
return false;
}
//image is off, so change src to x and return
if(src == 'x-off.png') {
img.attr('src','x.png');
return false;
}
});
Ответ 7
$("img").hover(
function() { this.src = this.src.replace("_Off", "_On");},
function() { this.src = this.src.replace("_On", "_Off");
});
http://kaidez.com/tutorial-simple-effective-jquery-image-rollover/
Ответ 8
Я создал плагин swapimg: http://xuannd.wordpress.com/2010/12/03/jquery-swap-images-easy/
use: $('. swapimg'). swapimg();
opt: $('. swapimg'). swapimg ({imgOn: "_ on.png", imgOff: ".png" });
(function($){
$.fn.swapimg=function(options){
var defaults={imgOn:"_on.gif",imgOff:".gif"};
var options=$.extend(defaults,options);
var $isOn=false;
var $obj_index=-1;
return this.each(
function(){
if($(this).is('img')){
obj=$(this)
}
else{
obj=$(this).find('img')
}
obj.hover(
function(){
if(this.src.indexOf('_on')==-1){
$isOn=false
}else{
$isOn=true
}
if($isOn==false){
this.src=this.src.replace(options.imgOff,options.imgOn)
}
},
function(){
if($isOn==false){
this.src=this.src.replace(options.imgOn,options.imgOff)
}
}
)
}
)
}
})(jQuery);