2009-06-30 22 views
11

tengo una lista de divs con imágenes en ellos:jQuery de palanca para cambiar la imagen

<div class="wizard-img"><%= image_tag("sources/pix/nyt.png") %></div> 
<div class="wizard-img"><%= image_tag("sources/pix/theguardian.png") %></div> 

Cuando un usuario hace clic en el div, me gustaría que cambie la imagen de x-On.png, cuando volvió a hacer clic, cambiará a x-off.png, y cuando se haga clic una tercera vez, debería volver a x.png.

¿Es posible hacer esto sin especificar manualmente jQuery para cada cambio de imagen? ¿Puedo recorrer el div y encontrar el nombre de la imagen, y simplemente agregar el -off/-on a la imagen?

Gracias!

Respuesta

1

FWIW, sugiero que hagas esto usando CSS simple y background-image. Me parece que esto no es realmente imágenes normales, sino más bien "botones".

+0

cada "botón" tiene diferentes imágenes [y diferentes imágenes de alternar]? – hejog

+0

No sé cuántas imágenes hay, pero si solo hay algunas, el enfoque que sugerí sigue funcionando, solo aplique otra clase, p. "uno", "dos" o "tres" dependiendo del estado en que se encuentre el botón. –

0
$('.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;  
    } 
}); 
+0

perdón, por "x" quise decir el nombre de la imagen en el div, por lo que sería nyt, theguardian, etc. .. ¿puede ser seleccionado a través de jquery? – hejog

22

Tal vez CSS sprites iba a trabajar para usted?

Eso le ahorraría a partir de la carga de una imagen separada cada vez que hace clic en la imagen (botón?), Y se podía resolver su problema mediante la adición y la eliminación de una clase CSS, por ejemplo:

$('.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'); 
     } 
    } 
); 
+0

Ambos estados se cargarán y estarán listos cuando el usuario presione el botón, ah, y usted reducirá sus solicitudes, lo cual siempre es una buena idea :) – Tom

+0

Esta es, sin duda, la ruta que tomaría para lograr lo que el solicitante necesita. – Travis

10

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"}); 
    } 
); 
+0

Eliminado en jQuery 1.9 –

3

CSS Sprites de hecho, sería la forma para hacer esto, pero simplemente para la corrección, aquí hay otra opción.

Normalmente yo soy el último en llegar a una expresión regular, pero creo que van a ayudar aquí

$('.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')); 
    } 
}); 
0

creé pl ugin swapimg: http://xuannd.wordpress.com/2010/12/03/jquery-swap-images-easy/
uso: $ ('. 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);