Простой JavaScript найти и заменить - PullRequest
6 голосов
/ 12 мая 2011

Есть ли простой метод для поиска в div для конкретной строки и замены ее другой?Я не могу использовать .replaceWith один, потому что внутри div есть другие элементы, которые мне нужно сохранить.Я пробовал различные методы javascript, найденные здесь, но безрезультатно.

Так что-то вроде:

$('#foo').find('this string').replaceWith('this other string');

для:

<div id="foo"><div id="child">Other Element</div>this string</div>

Спасибо.

Ответы [ 6 ]

9 голосов
/ 13 мая 2011

Это заменяет все вхождения:

var $foo = $('#foo'),
    fooHtml = $foo.html();

$foo.html(fooHtml.replace(/this string/g, 'this other string'));
7 голосов
/ 12 мая 2011

Попробуйте это:

var foo = $('#foo').html();

foo = foo.replace('this string', 'this other string');

$('#foo').html(foo);

Скрипка: http://jsfiddle.net/maniator/w9GzF/

3 голосов
/ 04 ноября 2012

Просто используя html (). Replace () с соответствием всем атрибутам элемента результатов или имени тега.

Я также сталкиваюсь с этой проблемой, мое решение похоже на функцию findAndReplace () из http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/, но с использованием регулярного выражения для получения всех textNode и поиска в каждом из них.

function epubSearch(query) {
    var d = document.getElementsByTagName("body")[0];
    var re = new RegExp(query, "gi");//pattern for keyword
    var re0 = new RegExp("[>][^><]*[><]", "gi");//pattern to get textnode

    d.innerHTML = d.innerHTML.replace(re0, function (text) {
        // with each textNode, looking for keyword
        return text.replace(re, "<span class=\"search-result\" style=\"background-color:red;\">$&</span>");
    });
}
2 голосов
/ 13 мая 2011

Вот плагин jQuery, который я только что написал, который обеспечивает safeReplace для коллекций.

(function($){

$.fn.safeReplace = function ( find, replacement ) {

    return this.each(function(index, elem) {

        var
            queue = [elem],
            node,
            i;

        while (queue.length) {

            node = queue.shift();

            if (node.nodeType === 1) {
                i = node.childNodes.length;
                while (i--) {
                    queue[queue.length] = node.childNodes[i];
                }
            } else if (node.nodeType === 3) {
                node.nodeValue = node.nodeValue.replace( find, replacement );
            }
        }

    });
};

})(jQuery);

А вот как вы его используете:

$('#foo').safeReplace( /this string/g, 'something else' );

Я тестировал только в FF 4 и только на примере ввода HTML - рекомендуется дополнительное тестирование.

Надеюсь, это поможет!

1 голос
/ 12 мая 2011

Что не так с String.replace (); ?

, например

$("#div").html($("#div").html().replace("search string", "replace string"));

или взорвался:

var $divElement = $("#div");         //Find the div to perform replace on
var divContent = $divElement.html(); //Get the div's content
divContent = divContent.replace("search string", "replace string"); //Perform replace
$divElement.html(divContent);        //Replace contents of div element.
0 голосов
/ 20 августа 2012

Этот работает столько раз, сколько появляется ваш термин, и не убивает ни одну из важных вещей, которые не должны быть изменены (сохранены в массиве exclude).

использование: findAndReplace('dog','cat', document.getElementById('content'));

/* js find andreplace Based on http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/ */

function findAndReplace(searchText, replacement, searchNode) {
if (!searchText || typeof replacement === 'undefined') {
    return;
}
var regex = typeof searchText === 'string' ?
            new RegExp(searchText, 'g') : searchText,
    childNodes = (searchNode || document.body).childNodes,
    cnLength = childNodes.length,
    excludes = ['html','head','style','link','meta','script','object','iframe'];
while (cnLength--) {
    var currentNode = childNodes[cnLength];
    if (currentNode.nodeType === 1 &&
      excludes.indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) {
      arguments.callee(searchText, replacement, currentNode);
    }
    if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
        continue;
    }
    var parent = currentNode.parentNode,
        frag = (function(){
            var html = currentNode.data.replace(regex, replacement),
                wrap = document.createElement('div'),
                frag = document.createDocumentFragment();
            wrap.innerHTML = html;
            while (wrap.firstChild) {
                frag.appendChild(wrap.firstChild);
            }
            return frag;
        })();
    parent.insertBefore(frag, currentNode);
    parent.removeChild(currentNode);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...