2011-01-22 3 views
2

Я пытаюсь немного изменить this так, чтобы он запрашивал текст для поиска, а затем текст для замены, а когда все выполненные обработки показывали диалоговое окно, позволяющее я знаю, что все сделано.Справка по закладке: Создание закладки/замены закладки

Я планирую использовать его на странице редактирования базы данных phpmyadmin, которая будет содержать любое количество текстовых полей, заполненных текстом (, что мне нужно для поиска и замены в). Кроме того, текст для поиска и замены может быть или не быть многострочным, поэтому я добавил параметр «m» в регулярное выражение, а также, поскольку я буду выполнять поиск/замену, который может содержать html, они Часто у них есть котировки/двойные кавычки. например:

Поиск:

<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> 

и, возможно, заменить ничем (просто стереть все, что код), или какой-либо другой HTML. До сих пор это букмарклет, который я придумал, (javascript, и особенно букмарклеты - это не то, что я часто использую с), но он ничего не делает для поиска/замены, хотя он правильно выполняет запрос.

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:','')); 

У кого-нибудь есть идеи?

ответ

1

Вот самое прямое преобразование исходной функции для поиска/замены текстовых полей и текстовых входов вместо HTML. Я также добавил 'm' в regex и добавил предупреждение ('done') в конце. Однако, Я думаю,, что использование «m» может не решить вашу проблему отлично, но я могу ошибаться.

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'); 

Здесь это как букмарклет.

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

Спасибо, я попробовал и ничего не произошло. (Подсказки, но нет замены вообще). –

+0

Я просто протестировал его в Firefox на веб-странице с текстовым полем и текстовым вводом. Оно работает. Если это не сработает для вас, есть некоторые детали, которые вы не объяснили. –

+0

Я сконденсировал ваш код в букмарклет (удаленные пробелы, добавил javascript :, и т. Д.): Вот скринкаст этого не работает. [ссылка] (http: // screencast.com/t/imfNn01s) В нем я сначала показываю код букмарклета, а затем показываю попытку выполнить поиск/замену с помощью тире (-) в качестве строки поиска и буквы «Т» в качестве строки замены, в то время как строка выделяется. Во второй раз я делаю то же самое, за исключением того, что строка не подсвечена, и я использую звездочку. Я делаю что-то неправильно? Это было в Firefox 15.01. –

1

Это работает для меня:

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")); 

Все, что я сделал, было заменить old и new с prompt() функции. хороший букмарклет.

+0

Спасибо, я дал ему попробовать, и ничего не произошло. (Подсказки, но нет замены вообще). –

0

Поиск приземлились меня здесь, и вещи выше неправильно (или по крайней мере устарели), и я пошел через трудности обновляя его, пока он не работал, так что я решил вставить здесь:

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.'); 

(Протестировано в Chrome) У него есть слово, а не просто сообщение «сделано». Я изменил его для сканирования всех элементов textNode. (Полагаю, что МОСТ люди не заботятся о замене всего текста на странице, но вот этот вариант привел меня сюда.)

Смежные вопросы