2011-01-24 3 views
2

Salut J'ai essayé de faire fonctionner ce script http://jsbin.com/ipajo5/ mais en utilisant .live() au lieu de .each() puisque la table html est remplie à la volée.Comment implémenter jquery live() au lieu de each()

$(document).ready(function() { 

    $('.bi').each(function() { 
    // options 
    var distance = 10; 
    var time = 250; 
    var hideDelay = 500; 

    var hideDelayTimer = null; 

    var beingShown = false; 
    var shown = false; 

    var trigger = $('.tt', this); 
    var popup = $('.popup', this).css('opacity', 0); 

    // set the mouseover and mouseout on both element 
    $([trigger.get(0), popup.get(0)]).mouseover(function() { 
     if (hideDelayTimer) clearTimeout(hideDelayTimer); 

     if (beingShown || shown) { 
     return; 
     } else { 
     beingShown = true;  
     popup.css({ 
      top: $(this).position().top-150, 
      left: $(this).position().left-100, 
      display: 'block' 
     }) 
     .animate({ 
      top: '-=' + distance + 'px', 
      opacity: 1 
     }, time, 'swing', function() { 
      beingShown = false; 
      shown = true; 
     }); 
     } 
    }).mouseout(function() { 
     if (hideDelayTimer) clearTimeout(hideDelayTimer); 

     hideDelayTimer = setTimeout(function() { 
     hideDelayTimer = null; 
     popup.animate({ 
      top: '-=' + distance + 'px', 
      opacity: 0 
     }, time, 'swing', function() { 
      shown = false; 
      popup.css('display', 'none'); 
     }); 
     }, hideDelay); 
    }); 
    }); 

});​ 

Remarque. Dans certains threads, il est recommandé d'utiliser delegate() à la place de live() pour les performances, mais après plusieurs jours, je veux seulement que cette popup/info-bulle fonctionne.

Merci.

Répondre

2

Vous n'avez en fait besoin de rien changer. J'ai une fonction similaire, mais un peu plus étendue. Supprimez-le simplement de la fonction document.ready. Rappelez-vous, vous êtes mieux d'utiliser delegate() au lieu de live(). En raison de bouillonnement. Si vous voulez une page entièrement automatisée, qui est téléchargée à la volée, jetez un oeil à jaltiere.com

Mais vous devrez entièrement réécrire votre script. En outre, live() et delegate() sont difficiles à configurer avec les événements mouseover et mouseout.

Aucune mise en cache dans le document.ready:

Sur chargement de la page
$(document).ready(function() { 
      $.ajaxSetup({ cache: false });}); 

, faites votre ajax-appel et appelez votre script en fonction séparée:

$(function() { 
$.get("ajaxpage.php", function(data) { 
    $("#recent").html(data); 
    bifunct(); 
});}); 

fonction pour une mise à jour Separate:

function ajaxcall(){ 
$.get("ajaxpage.php?", function(data) { 
    $("#recent").html(data); 
    bifunct(); 
});}; 

Et maintenant votre script. J'ai changé votre mouseover et mouseout pour mouseenter et mouseleave. Ils travaillent légèrement mieux.

bifunct = function(){ 
$('.bi').each(function() { 
    // options 
    var distance = 10; 
    var time = 250; 
    var hideDelay = 500; 
    var hideDelayTimer = null; 
    var beingShown = false; 
    var shown = false; 
    var trigger = $('.tt', this); 
    var popup = $('.popup', this).css('opacity', 0); 

    // set the mouseover and mouseout on both element 
    $([trigger.get(0), popup.get(0)]).mouseenter(function() { 
     if (hideDelayTimer) clearTimeout(hideDelayTimer); 
     if (beingShown || shown) { 
      return; 
     } else { 
      beingShown = true;  
      popup.css({ 
       top: $(this).position().top-150, 
       left: $(this).position().left-100, 
       display: 'block' 
      }) 
      .animate({ 
       top: '-=' + distance + 'px', 
       opacity: 1 
      }, time, 'swing', function() { 
       beingShown = false; 
       shown = true; 
      }); 
     } 
    }).mouseleave(function() { 
     if (hideDelayTimer) clearTimeout(hideDelayTimer); 
     hideDelayTimer = setTimeout(function() { 
      hideDelayTimer = null; 
      popup.animate({ 
       top: '-=' + distance + 'px', 
       opacity: 0 
      }, time, 'swing', function() { 
       shown = false; 
       popup.css('display', 'none'); 
      }); 
     }, hideDelay); 
    }); 
});} 

Si vous souhaitez mettre à jour, il suffit de mettre dans votre corps, ou changer pour appeler la ajaxcall fonction:

<a onclick="ajaxcall();return false" href="#"> update </a> 
+0

Je l'ai transformé en fonction et l'ai ajouté à la fin des fonctions de dessin (j'ai 2 tables sur la page qui fonctionnent différemment). Je vais essayer avec mouseenter et mouseleave plus tard après plus de tests sur différents navigateurs et compléter toutes les fonctionnalités de la page. Merci @Daniel –

5

Remplacer ".each()" par ".live()" est très peu sensé. La fonction ".each()" est prévue pour itérer sur les parties du DOM qui ont été mises en correspondance par un sélecteur, ou bien pour itérer fonctionnellement les constituants d'un objet jQuery.

Tout ce que ".live()" peut faire est d'aider à la gestion des événements. Si vous avez besoin de faire d'autres choses sur des parties de votre page, car elles sont chargées dynamiquement, vous devrez les regrouper vous-même dans les gestionnaires de "succès" pour les mises à jour dynamiques, ou quelque chose de similaire.

+0

Je sais .each() est à itérer sur un objet jQuery, l'exécution d'une fonction pour chaque élément correspondant et live() consiste à attacher un gestionnaire à l'événement pour tous les éléments qui correspondent au sélecteur actuel, maintenant et dans le futur. Donc, peut-être que ma question n'est pas très descriptive, je veux que le script fonctionne, mais je ne parviens pas à attacher la fonctionnalité du script pour recréer des éléments html à la volée, qui ne correspondent pas à chaque() –

+0

@ Joaquín Duaso OK c'est bon - alors qu'est-ce que tu veux faire? – Pointy

+0

@Joaquin, donc vous voulez que les gens interprètent un script assez complexe avec absolument aucune information d'arrière-plan et pour lire votre esprit quant à ce que vous aimeriez qu'il fasse? – Vadim

Questions connexes