javascript - 将跨度添加到字符串(HTML 元素中)中的字符

标签 javascript jquery

我想循环遍历元素中文本的字符并添加 span s 到 Angular 色。使用 jQuery.map() 这非常容易:

$elem = $('h1');
var chars = jQuery.map($elem.text().split(''), function(c) {
  return '<span>' + c + '</span>';
});
$elem.html(chars.join('')); 

以上works great with a simple string ,但现在我想更改该函数,以便它也可以处理更“复杂”的内容,例如: <h1>T<em>e</em><b>st</b></h1> 。应翻译为:<h1><span>T</span><em><span>e</span></em><b><span>s</span><span>t</span></b></h1> .

这意味着我不能再简单地循环遍历元素中的所有字符。我可以使用某些东西来循环元素以及所有子元素的内容(字符)吗?或者还有其他方法可以实现我想要的吗?

最佳答案

总体思路:

您可以递归地迭代子节点。如果遇到元素节点,则迭代其子节点等。如果遇到文本节点,则将其替换为一系列 span 元素。

<小时/>

jQuery

function wrapCharacters(element) {
    $(element).contents().each(function() {
        if(this.nodeType === 1) {
            wrapCharacters(this);
        }
        else if(this.nodeType === 3) {
            $(this).replaceWith($.map(this.nodeValue.split(''), function(c) {
               return '<span>' + c + '</span>';
            }).join(''));
        }
    });
}    

wrapCharacters($('h1')[0]);

DEMO

<小时/>

JavaScript(不含 jQuery)

这个想法保持不变,即使没有 jQuery,包装每个字符也不是很困难:

var d_ = document.createDocumentFragment();

for(var i = 0, len = this.nodeValue.length; i < len; i++) {
    var span = document.createElement('span');
    span.innerHTML = this.nodeValue.charAt(i);
    d_.appendChild(span);
}
// document fragments are awesome :)
this.parentNode.replaceChild(d_, this);

仅对子节点进行迭代时必须小心,因为文本节点在迭代过程中会被删除。

Plain JavaScript example

关于javascript - 将跨度添加到字符串(HTML 元素中)中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666277/

相关文章:

javascript - 有什么方法可以控制语义 ui 弹出窗口的时间延迟吗?

javascript - 如何计算同一类的元素数量?

php - 我如何使用 php 查看 jquery 对话框中的每个内容

javascript - 用单击的按钮填充文本区域

javascript - 仅根据单选按钮和复选框按钮显示/隐藏 div

javascript - JQuery 摇动效果不适用于 php 表单验证

javascript - 触发下拉菜单的变化事件

javascript - IE7 : . 删除()不起作用 - 元素(byID)不存在

javascript - 顶级 javascript 导入 - Redux

php - jQGrid 与 Oracle 数据库