2010-03-12 8 views
0

J'ai fait une très simple jQueryimg fonction de retournement inspirée par celui-ci: http://www.smileycat.com/miaow/archives/000224.php.Très simple jQuery rollover

Il suffit de cocher toutes les img s qui contiennent _off en leur nom et de les échanger avec un img avec le même nom, mais « _A » au lieu de « _off ».

Étant donné que je ne peux pas utiliser le fond img dans ma mise en page, je pense que c'est une solution pratique. Mais j'ai l'impression que l'échange n'est pas fluide, comme si la fonction était lente. Que pensez-vous? Y a-t-il des façons de l'optimiser?

Voici le code:

function roll_over() { 
     $("img[src*='_off']").hover(
      function() { 
       var stringa = $(this).attr("src"); 
       var stringa = stringa.replace("_off", "_on"); 
       $(this).attr("src", stringa); 
      }, 
      function() { 
       var stringa = $(this).attr("src"); 
       var stringa = stringa.replace("_on", "_off"); 
       $(this).attr("src", stringa); 
      } 
     ); 
    } 
+0

Quand appelez-vous cette fonction? – Buggabill

+0

J'appelle la fonction sur document.ready – Gusepo

Répondre

0

faire est inefficace $("img[src*='_off']") à plusieurs reprises. Cela signifie que le navigateur doit tout chercher sur une page lorsque vous vous retournez. Vous devez inclure jQuery Lint pour plus d'informations sur l'optimisation ...

+0

Je suis d'accord que l'appel répété de cette fonction à un événement mouseover serait inutile, inefficace et déconseillé. S'ils l'appellent sur le chargement de la page, c'est complètement différent. – Buggabill

+0

Définir deux fois la variable 'stringa' ?? –

+0

oui, c'est vrai – Ross

2

Votre code est incorrect. Pourquoi?

  1. Il échouera lorsque vous aurez l'image comme ceci: ...src="/images/my_office.png"...
  2. Vous utilisez JS quelque chose qui est si primitive qui peut être fait en CSS pur
  3. Les images *_on seront chargés sur mouseover événement donc vous ne verrez aucune image pendant un moment.

Comment résoudre tous ces problèmes? Utilisez CSS Sprites.

  1. Créer une image comme celle-ci: http://www.digart.pl/gfx/ico/s/fb.gif
  2. Code HTML: <a href="..." id="myId">blah</a> (Evidement, vous ne devez pas utiliser l'élément A).
  3. code CSS:

    #myId { 
        display: inline-block; /* or block, or even inline with correct line-height */ 
        width: 33px; 
        height: 20px; 
        background: url(/path/to/img) 0 0 no-repeat; 
    } 
    #myId:hover { 
        background-position: 50% 0; 
    } 
    

Si vous voulez continuer à automatiser processus puis utilisez JS seulement pour changer de position de fond au lieu de l'image.

+0

Les sprites CSS +1 vont vraiment rendre beaucoup plus facile et plus rapide. – ryanulit

+0

Je ne sais pas pourquoi, mais le PO dit ceci dans leur question: "... je ne peux pas utiliser les imgs de fond dans ma disposition." C'est peut-être pourquoi ils essaient de le faire de cette façon. – Buggabill

+0

@Buggabill: Ops ... ma faute. Je n'ai pas remarqué ça. – Crozin

0

Que diriez-vous quelque chose comme:

// Add an image to your page as: 
// <img src="button.png" class="rollover"> 

<script type='text/javascript'> 
$(document).ready(function(){ 
    initRollovers(); 
}); 
function initRollovers() { 
    // Assign a class to the images you want to have as roll-over enabled. 
    // Example: 
    // <img src="button.png" class="rollover"> 
    // NOTE: No "dot" when setting the class on the image... But jQuery needs the .dot in order to search for classes in this script: 
    var classIdentifier = ".rollover"; 

    // This example assumes that only the "on" state has a suffix: 
    // button.png 
    // button_on.png 

    // If you have a suffix for both states, edit them here: 
    // button_off.png 
    // button_on.png 
    // ... would be edited as: 
    // var offSuffix = "_off.png"; 
    // var onSuffix = "_on.png"; 

    var offSuffix = ".png"; 
    var onSuffix = "_on.png"; 

    $(classIdentifier).each(function() { 

     var obj = $(this); 
     var mySrcOff = obj.attr("src"); 
     var mySrcOn = mySrcOff.replace(offSuffix, onSuffix); 
     obj.mouseout(function() { 
      $(this).attr("src", mySrcOff); 
     }); 
     obj.mouseover(function() { 
      $(this).attr("src", mySrcOn); 
     }); 

     // Preload Off State 
     $('<img />').attr('src', mySrcOn).appendTo('body').css('display','none'); 

    }); 
} 

</script> 

.