2011-01-01 2 views
0

j'ai essayé de mettre en œuvre le plugin jQuery replaceText de http://benalman.com/projects/jquery-replacetext-plugin/jQuery remplacer le texte en utilisant replaceText et variable

Mais rien ne se passe lorsque le code est exécuté.

Merci pour tous les indices. Sincèrement Marek

/** 
* jQuery Plugin replaceText 
**/ 

(function($){ 
$.fn.replaceText=function(b,a,c){ 
    return this.each(function(){ 
     var f=this.firstChild,g,e,d=[]; 
     if(f){ 
      do{ 
       if(f.nodeType===3){ 
        g=f.nodeValue; 
        e=g.replace(b,a); 
        if(e!==g){ 
         if(!c&&/</.test(e)){ 
          $(f).before(e); 
          d.push(f) 
         }else{ 
          f.nodeValue=e 
         } 
        } 
       } 
      }while(f=f.nextSibling) 
     } 
     d.length&&$(d).remove() 
    }) 
} 
})(jQuery); 

/** 
* variable containing content of q variable from google referer 
**/ 

var querywords = "Some+text+from+google%20referer"; 

/** 
* function for replace each word from body with its "marked" version 
* that is after handled by css propetry for "mark" element 
**/ 

$(document).ready(function () { 
if(window.querywords !== undefined){ 
    var qw = window.querywords.replace('%20','+'); 
    qw = qw.replace(' ','+'); 
    var splited = qw.split("+"); 
    for(var q in splited){ 
     $('body :not(textarea)').replaceText(/\bsplited[q]\b/gi, '<mark>$1</mark>'); 
    } 
} 
}); 

Répondre

2

Au lieu d'essayer d'utiliser la variable directement dans le regex comme ceci:

$('body :not(textarea)').replaceText(/\bsplited[q]\b/gi, '<mark>$1</mark>'); 

Vous devez construire l'expression régulière de la chaîne, comme ceci:

$('body :not(textarea)').replaceText(new RegExp("\\b("+splited[q]+")\\b","gi"),'<mark>$1</mark>'); 

Il y a aussi quelques autres problèmes, par exemple une boucle for...in sur un tableau, dans l'ensemble, vous voulez qu'il ressemble à ceci:

$(document).ready(function () { 
    if(window.querywords !== undefined){ 
     var qw = window.querywords.replace('%20','+'); 
     qw = qw.replace(' ','+'); 
     var splited = qw.split("+"); 
     for(var q=0; q<splited.length; q++){ 
      $('body :not(textarea)').replaceText(new RegExp("\\b("+splited[q]+")\\b","gi"),'<mark>$1</mark>'); 
     } 
    } 
}); 

Ou, un peu plus compact:

$(function() { 
    if(window.querywords === undefined) return; 
    var qw = window.querywords.replace(/%20| /,'+').split("+"); 
    for(var q=0; q<qw.length; q++){ 
    $('body :not(textarea)').replaceText(new RegExp("\\b("+qw[q]+")\\b","gi"),'<mark>$1</mark>'); 
    } 
}); 

You can test it out here.

+0

Merci beaucoup. Mais dites-moi, quel est le problème avec ... dans? Quand je l'ai testé, la boucle a traversé les mots correctement, ou y at-il un désavantage avec ce type de boucle? –

+1

@Marek - IE énumère dans l'ordre ajouté, plutôt que l'ordre des index par exemple :) –

+0

Ahh, donc c'est encore problème IE-dépendante. Merci pour les explications, je me bats avec ce gentil explorateur buggy depuis des années. Hope IE9 nous libèrera dès que possible. –

Questions connexes