Найдите все экземпляры "старого" на веб-странице и замените их "новыми", используя букмарклет javascript

То, что я хочу сделать, это заменить все экземпляры "старого" на веб-странице "новым" в букмаркете JS или greasemonkey script. Как я могу это сделать? Я полагаю, что jQuery или другие фреймворки в порядке, так как есть хаки, чтобы включать их как в букмарклеты, так и в сценарии greasemonkey.

Ответы

Ответ 1

Функция, которая является clobber-proof. Это означает, что это не коснется каких-либо тегов или атрибутов, только текст.

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].nodeType == Node.TEXT_NODE) {
            var r = new RegExp(a, 'gi');
            nodes[n].textContent = nodes[n].textContent.replace(r, b);
        } else {
            htmlreplace(a, b, nodes[n]);
        }
    }
}

htmlreplace('a', 'r');

Версия прокладок:

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].nodeType==Node.TEXT_NODE){nodes[n].textContent=nodes[n].textContent.replace(new RegExp(a,'gi'),b);}else{htmlreplace(a,b,nodes[n]);}}}htmlreplace('old','new');

Ответ 2

Если вы замените innerHtml, вы уничтожите любые домашние события, которые у вас есть на странице. Попробуйте переместить документ, чтобы заменить текст:

function newTheOlds(node) {
    node = node || document.body;
    if(node.nodeType == 3) {
        // Text node
        node.nodeValue = node.nodeValue.split('old').join('new');
    } else {
        var nodes = node.childNodes;
        if(nodes) {
            var i = nodes.length;
            while(i--) newTheOlds(nodes[i]);
        }
    }
}

newTheOlds();

Разделение/объединение происходит быстрее, чем "замена", если вам не требуется сопоставление шаблонов. Если вам требуется сопоставление образцов, используйте "replace" и regex:

node.nodeValue = node.nodeValue.replace(/(?:dog|cat)(s?)/, 'buffalo$1');

Как букмарклет:

javascript:function newTheOlds(node){node=node||document.body;if(node.nodeType==3){node.nodeValue=node.nodeValue.split('old').join('new');}else{var nodes=node.childNodes;if(nodes){var i=nodes.length;while(i--)newTheOlds(nodes[i]);}}}newTheOlds();

Ответ 3

Для старых браузеров потребуется изменить Node.TEXT_NODE на 3 и Node.textContent на Node.nodeValue; поэтому окончательная функция должна читать:

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].nodeType == 3) { //Node.TEXT_NODE == 3
            var r = new RegExp(a, 'gi');
            nodes[n].nodeValue = nodes[n].nodeValue.replace(r, b);
        } else {
            htmlreplace(a, b, nodes[n]);
        }
    }
}

Ответ 4

Простая строка, которая работает вдоль jQuery:

`javascript:var a = function(){$("body").html($("body").html().replace(/old/g,'new'));return;}; a();`

Без jQuery:

`javascript:function a (){document.body.innerHTML=document.body.innerHTML.replace(/old/g, "new" );return;}; a();`

Функция, возвращающая ничего, очень важна, поэтому браузер не перенаправляется нигде после выполнения букмарклета.

Ответ 5

Еще один рекурсивный подход:

function replaceText(oldText, newText, node){ 
  node = node || document.body; 

  var childs = node.childNodes, i = 0;

  while(node = childs[i]){ 
    if (node.nodeType == Node.TEXT_NODE){ 
      node.textContent = node.textContent.replace(oldText, newText); 
    } else { 
      replaceText(oldText, newText, node); 
    } 
    i++; 
  } 
}

Минимированный букмарклет:

javascript:function replaceText(ot,nt,n){n=n||document.body;var cs=n.childNodes,i=0;while(n=cs[i]){if(n.nodeType==Node.TEXT_NODE){n.textContent=n.textContent.replace(ot,nt);}else{replaceText(ot,nt,n);};i++;}};replaceText('old','new');

Ответ 6

Хорошо, я просто консолидирую некоторые из великих вещей, которые люди вкладывают в один ответ.

Вот код jQuery шестого gear, но сделанный портативный (я исходный jQuery из большой G) и преобразованный в букмарклет:

javascript:var scrEl=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 htmlreplace(a,b,element){if(!element)element=document.body;var nodes=$(element).contents().each(function(){if(this.nodeType==Node.TEXT_NODE){var r=new RegExp(a,'gi');this.textContent=this.textContent.replace(r,b);}else{htmlreplace(a,b,this);}});}htmlreplace('old','new');

ПРИМЕЧАНИЕ: "old" может быть либо "строковым литералом", либо "reg [Ee] x".

Собственно, теперь, когда я думаю об этом, шестой гиг - лучший ответ, особенно с моими улучшениями. Я не могу найти ничего, что добавит другие ответы, используя jQuery, чтобы добиться невероятной совместимости с X-браузером. Плюс, я просто слишком ленив. сообщество wiki, Enjoy!

Ответ 7

Эй, вы могли бы попробовать это, проблема в том, что он ищет все тело, поэтому даже атрибуты и такие изменения меняются.

javascript:document.body.innerHTML=document.body.innerHTML.replace( /old/g, "new" );

Ответ 8

Я пытаюсь немного изменить это, чтобы он запрашивал текст для поиска, а затем текст, который нужно заменить, и когда вся сделанная обработка показывает диалоговое окно, позволяющее мне это знать.

Я планирую использовать его на странице редактирования базы данных 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:',''));

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