2010-04-25 3 views
0

J'essaye de créer un système de glossaire qui va obtenir une liste de mots communs et leurs définitions via ajax, puis remplacer toute occurrence de ce mot dans certains éléments (ceux avec la classe useGlossary) avec un lien vers la définition complète et fournir une courte définition sur le survol de la souris. La façon dont je le fais fonctionne, mais pour les grandes pages il faut 30-40 secondes, au cours de laquelle la page se bloque. Je voudrais soit diminuer le temps qu'il faut pour faire le remplacement, soit faire en sorte que le remplacement fonctionne en arrière-plan sans accrocher la page. J'utilise jquery pour la plupart du javascript, et Qtip pour le survol de la souris. Voici mon code lent existant:Remplacer certains mots par des liens vers des définitions en utilisant Javascript

$(document).ready(function() { 
    $.get("fetchGlossary.cfm", null, glossCallback, "json"); 
}); 

function glossCallback(data) 
{ 

    $(".useGlossary").each(function() { 
     var $this = $(this); 
     for (var i in data) 
     { 

      $this.html($this.html().replace(new RegExp("\\b" + data[i].term + "\\b", "gi"), function(m) {return makeLink(m, data[i].def);})); 
     } 
     $this.find("a.glossary").qtip({ style: { name: 'blue', tip: true } }) 
    }); 
} 

function makeLink(m, def) 
{ 
    return "<a class='glossary glossary" + m.replace(/\s/gi, "").toUpperCase() + "' href='reference/glossary.cfm' title='" + def + "'>" + m + "</a>"; 
} 

Merci pour vos commentaires/suggestions!

+0

Faire cela sur le serveur serait optimal. – Matt

Répondre

2

Au lieu de remplacer le code HTML sur et plus, pourquoi ne pas modifier votre fonction comme ceci:

function glossCallback(data) 
{ 

    $(".useGlossary").each(function() { 
     var $this = $(this); 
     var html = $this.html(); 
     for (var i in data) 
     { 

      html.replace(new RegExp("\\b" + data[i].term + "\\b", "gi"), function(m) {return makeLink(m, data[i].def);}); 
     } 
     $this.html(html); 
     $this.find("a.glossary").qtip({ style: { name: 'blue', tip: true } }) 
    }); 
} 

De cette manière, le DOM ne doit rafraîchir sur chaque REPLACE.

+0

Merci. Pour une raison quelconque, replace() ne fonctionne pas lorsqu'il est utilisé comme ça. J'ai dû sortir l'appel de fonction et le remplacer par la chaîne actuelle, perdant la capacité de préserver le boîtier d'origine. Aussi, bien que cela se rase un peu le temps, il est loin d'être utilisable sur nos pages plus longues. Je vais probablement devoir le faire sur le serveur. Je vais laisser la question un peu ouverte, pour voir si quelqu'un d'autre a d'autres idées, sinon j'accepte la vôtre. – adharris

+0

Une autre chose que vous pourriez essayer est de créer un objet RegExp global et simplement changer son modèle - c'est-à-dire regExp.source = "\\ b" + data [i] .term + "\\ b". Cela permettrait d'alléger le "nouveau" récurrent à chaque itération. Je crois que cela peut aider. – BradBrening

+0

En fait, j'ai juste jeté un oeil à la page que notre autre dev passait à ceci, la putain de chose a plus de 3000 instances de classe useGlossary, et la source est proche de 100000 lignes. Commencer à penser que ce n'est pas complètement mon problème. Merci! – adharris

Questions connexes