2011-01-22 4 views
2

J'essaie de modifier légèrement this afin qu'il demande le texte à rechercher, suivi du texte à remplacer par, et lorsque tout le traitement est terminé, affiche une boîte de dialogue Je sais que c'est fait. Je prévois de l'utiliser sur une page d'édition de base de données phpmyadmin qui aura un certain nombre de zones de texte remplies de texte (dont j'ai besoin pour rechercher et remplacer dans). De plus, le texte à rechercher et à remplacer peut ou non être multiligne, j'ai donc ajouté le paramètre 'm' dans la regex, et aussi, puisque je vais faire des recherches/remplacer qui peuvent contenir du HTML, ils Il y aura souvent des citations/doubles quotes en eux. ex:Bookmarklet Aide: Création d'un Bookmarklet/Replace Bookmarklet

Rechercher:

<img height="76" width="92" src="http://www.gifs.net/Animation11/Hobbies_and_Entertainment/Games_and_Gambling/Slot_machine.gif" /></div> 
<div class="rtecenter"> <strong><em><font color="#ff0000">Vegas Baby!<br /> 
</font></em></strong></div> 

et remplacer peut-être rien (pour effacer juste tout ce que le code), ou un autre html. Jusqu'à présent, c'est le bookmarklet que j'ai trouvé, (javascript, et surtout bookmarklets ne sont pas quelque chose que je salope souvent) mais il ne fait rien pour trouver/remplacer, bien qu'il fasse l'invite correctement.

javascript:var%20scrEl=document.createElement('script');scrEl.setAttribute('language','javascript');scrEl.setAttribute('type','text/javascript');scrEl.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js');function%20htmlreplace(a,b,element){if(!element)element=document.body;var%20nodes=$(element).contents().each(function(){if(this.nodeType==Node.TEXT_NODE){var%20r=new%20RegExp(a,'gim');this.textContent=this.textContent.replace(r,b);}else{htmlreplace(a,b,this);alert('Done%20processing.');}});}htmlreplace(prompt('Text%20to%20find:',''),prompt('Replace%20with:','')); 

Vous avez des idées?

Répondre

1

Voici la conversion la plus directe de la fonction d'origine pour rechercher/remplacer des entrées de texte et de texte au lieu du HTML. J'ai aussi ajouté 'm' à regex et ajouté alert ('done') à la fin. Cependant, je pense que l'utilisation de «m» peut ne pas résoudre votre problème parfaitement, mais je peux me tromper.

function htmlreplace(a, b, element) { 
    if (!element) element = document.body;  
    var nodes = element.childNodes; 
    for (var n=0; n<nodes.length; n++) { 
     if (nodes[n].type && (nodes[n].type.toLowerCase() == 'textarea' || nodes[n].type.toLowerCase() == 'text')) { 
      var r = new RegExp(a, 'gim'); 
      nodes[n].value = nodes[n].value.replace(r, b); 
     } else { 
      htmlreplace(a, b, nodes[n]); 
     } 
    } 
} 

htmlreplace(prompt('find'), prompt('replace')); 
alert('done'); 

Ici, c'est comme un bookmarklet.

javascript:function htmlreplace(a,b,element){if(!element)element=document.body;var nodes=element.childNodes;for(var n=0;n<nodes.length;n++){if(nodes[n].type&&(nodes[n].type.toLowerCase()=='textarea'||nodes[n].type.toLowerCase()=='text')){var r=new RegExp(a,'gim');nodes[n].value=nodes[n].value.replace(r,b)}else{htmlreplace(a,b,nodes[n])}}}htmlreplace(prompt('find'),prompt('replace'));alert('done'); 
+0

Merci, je l'ai essayé et rien ne s'est passé. (Invites, mais pas de remplacement du tout). –

+0

Je viens de retester dans Firefox sur une page web avec une zone de texte et une entrée de texte. Ça marche. Si cela ne fonctionne pas pour vous, il y a des détails que vous n'avez pas expliqués. –

+0

J'ai condensé votre code dans un bookmarklet (espaces supprimés, javascript ajouté, etc): Voici un screencast de cela ne fonctionne pas. [lien] (http: // screencast.com/t/imfNn01s) Dans ce je montre d'abord le code bookmarklet, puis montrer une tentative de faire une recherche/remplacement en utilisant un tiret (-) comme la chaîne de recherche et la lettre "T" comme chaîne de remplacement pendant que la ligne est mis en évidence. La deuxième fois que je fais la même chose, sauf que la ligne n'est pas en surbrillance, et j'utilise un astérisque. Est-ce que je fais quelque chose de mal? C'était dans Firefox 15.01. –

1

Cela a fonctionné pour moi:

javascript:function%20htmlreplace(a,b,element){if(!element)element=document.body;var%20nodes=element.childNodes;for(var%20n=0;n<nodes.length;n++){if(nodes[n].nodeType==Node.TEXT_NODE){nodes[n].textContent=nodes[n].textContent.replace(new%20RegExp(a,'gi'),b);}else{htmlreplace(a,b,nodes[n]);}}}htmlreplace(prompt("Text%20to%20replace:","old"),prompt("Replacement%20text:","new")); 

Tout ce que je ne faisais remplacer le old et new avec une fonction prompt(). bon bookmarklet.

+0

Merci, je l'ai essayé et rien ne s'est passé. (Invites, mais pas de remplacement du tout). –

0

Une recherche m'a débarqué ici, et les choses ci-dessus est faux (ou tout au moins pas à jour), et je suis passé par la peine de le mettre à jour jusqu'à ce qu'il a travaillé, donc je pensais que je serais le coller ici:

javascript:var count=0; 
function htmlreplace(a,b,element){ 
if(!element)element=document.body; 
var nodes=element.childNodes; 
for(var n=0;n<nodes.length;n++){ 
    if(nodes[n].type&&nodes[n].type.toLowerCase()=='textarea'){ 
     var r=new RegExp(a,'gim'); 
     if(nodes[n].value.match(r)){ 
     count++; 
     } 
     nodes[n].value=nodes[n].value.replace(r,b) 
    } 
    else if(nodes[n].nodeValue && nodes[n].nodeValue.length > 0){ 
     var r=new RegExp(a,'gim'); 
     if(nodes[n].nodeValue.match(r)){ 
     count++; 
     } 
     nodes[n].nodeValue=nodes[n].nodeValue.replace(r,b) 
    } 
    else{ 
     htmlreplace(a,b,nodes[n]) 
    } 
    } 
} 
htmlreplace(prompt('find'),prompt('replace')); 
alert('replaced '+count+' words.'); 

(Testé dans Chrome) Il a un nombre de mots au lieu d'un message 'fait'. Je l'ai changé pour balayer tous les éléments textNode. (Je suppose que la plupart des gens ne se soucient pas de remplacer tout le texte sur la page, mais c'est le cas d'utilisation qui m'a amené ici.)