javascript - 仅处理 HTML 中的文本并放回原位

标签 javascript

我需要找到 div 中的所有文本,进行一些文本处理,然后将处理后的文本放回原处。

示例 html(但可以是任何内容):

<div id="divToProcess">
    <div>Some text here</div>
    <div id="id1">some more <span class="class2">text</span> and more text</div>
    <div class="class1">some more text <a href="xxxxxx">link text</a><div>
</div>

所以在上面我需要循环divToProcess内的所有元素,获取所有文本(在上面的情况下我需要获取“这里有一些文本”,“更多一些”,“文本”,“和更多文本”, “更多文本”、“链接文本”),然后在处理文本后(根据文本进行一些更改),我需要将其放回原位(进行更改)。

我不知道如何进行循环以便从所有元素中获取所有文本。我更喜欢非 jQuery 解决方案,但会采取任何措施...

最佳答案

这是一种灵活的方法,使用回调:

function replaceTextNodes(node, callback) {
    if (node.nodeType === 1) {
        for (var i = 0; i < node.childNodes.length; i++) {
            replaceTextNodes(node.childNodes[i], callback);
        }
    } else if (node.nodeType === 3) {
        node.textContent = callback(node.textContent);
    }
}

replaceTextNodes(document.getElementById("divToProcess"), function (text) {
    return text + text;
});

http://jsfiddle.net/QAyAM/

这将使所有事件处理程序等保持不变,正如您可能想要的那样。

编辑:允许用 HTML 替换文本的功能。我不确定这种方法是否正确/好,如果有人有任何意见,请发表评论,以便我们大家都可以学习。 :)

测试 HTML:

<div id="divToProcess">
    <div>Some text here</div>
    <div id="id1">so hello me more <span class="class2">text</span> and more text</div>
    <div class="class1">some more text <a href="xxxxxx">link text</a>
        hello!! hello
    <div>
</div>

JS:

function replaceTextNodesWithHTML(node, callback) {
    if (node.nodeType === 1) {
        for (var i = 0; i < node.childNodes.length; i++) {
            replaceTextNodesWithHTML(node.childNodes[i], callback);
        }
    } else if (node.nodeType === 3) {
        var parentNode = node.parentNode;
        var div = document.createElement("div");
        div.innerHTML = callback(node.textContent);
        var childNodes = [].slice.call(div.childNodes);
        if (childNodes.length > 0) {
            parentNode.replaceChild(childNodes[childNodes.length - 1], node);
            for (var i = childNodes.length - 2; i >= 0; i--) {
                parentNode.insertBefore(childNodes[i], childNodes[i + 1]);
            }
        }
    }
}

replaceTextNodesWithHTML(document.getElementById("divToProcess"), function (text) {
    return text.replace(/hello/g, "<a href='#'>Hello!</a>");
});

http://jsfiddle.net/tXS2v/1/

关于javascript - 仅处理 HTML 中的文本并放回原位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401657/

相关文章:

javascript - 在 React 路由中将 Props 传递给组件

javascript - node.js 从 url 下载图像

javascript - Vue 使用 v-model 选择第一个选项

javascript - 逆时针旋转图像

javascript - 如何将 Bower 依赖项移至适当位置

javascript - CSSRules 为空

javascript - 为什么我不能在这个方法中调用 props ? ( react )

JavaScript - 展平嵌套对象数组

javascript - 当数组的两个元素是相同字符串值时条件检查的问题

javascript - DurandalJS - 无需刷新 View 模型即可导航