如何在span标记中包含元素的每个单词?

use*_*551 13 javascript jquery

$("div.date")
    .contents()
    .filter(
        function(){
            return this.nodeType != 1; 
        })
    .wrap("<span/>");
Run Code Online (Sandbox Code Playgroud)

我是新手,并认为代码可以完成这个技巧,但它包装了所有内容,<span>所以:

<div class='date'><span>2011年12月22日</span></div>

它应该看起来像这样:

<div class='date'>
  <span>Dec</span>
  <span>22,</span>
  <span>2011</span>
</div>
Run Code Online (Sandbox Code Playgroud)

Ale*_*pin 26

它会比那复杂一点.你将不得不找出所有的单词并将它们重新附加到你的元素中,包裹在一个跨度中.

var words = $("p").text().split(" ");
$("p").empty();
$.each(words, function(i, v) {
    $("p").append($("<span>").text(v));
});
Run Code Online (Sandbox Code Playgroud)

实例


yck*_*art 26

这个简单的任务你不需要 jQuery.String.prototype.replace和正则表达式应该做的伎俩.

我刚刚制作了一些简单的实用函数,包括字母,单词和行:

/**
 * Wraps a string around each character/letter
 *
 * @param {string} str The string to transform
 * @param {string} tmpl Template that gets interpolated
 * @returns {string} The given input as splitted by chars/letters
 */
function wrapChars(str, tmpl) {
  return str.replace(/\w/g, tmpl || "<span>$&</span>");
}

/**
 * Wraps a string around each word
 *
 * @param {string} str The string to transform
 * @param {string} tmpl Template that gets interpolated
 * @returns {string} The given input splitted by words
 */
function wrapWords(str, tmpl) {
  return str.replace(/\w+/g, tmpl || "<span>$&</span>");
}

/**
 * Wraps a string around each line
 *
 * @param {string} str The string to transform
 * @param {string} tmpl Template that gets interpolated
 * @returns {string} The given input splitted by lines
 */
function wrapLines(str, tmpl) {
  return str.replace(/.+$/gm, tmpl || "<span>$&</span>");
}
Run Code Online (Sandbox Code Playgroud)

用法非常简单.只需传入字符串作为第一个参数包装.如果需要自定义标记,请将其作为第二个参数传入,同时$&替换为每个字符/单词/行.

var str = "Foo isn't equal\nto bar.";
wrapChars(str); // => "<span>F</span><span>o</span><span>o</span> <span>i</span><span>s</span><span>n</span>'<span>t</span> <span>e</span><span>q</span><span>u</span><span>a</span><span>l</span> <span>t</span><span>o</span> <span>b</span><span>a</span><span>r</span>."
wrapWords(str); // => "<span>Foo</span> <span>isn</span>'<span>t</span> <span>equal</span> <span>to</span> <span>bar</span>."
wrapLines(str); // => "<span>Foo isn't equal</span> <span>to bar.</span>"
Run Code Online (Sandbox Code Playgroud)

  • @HenrikPetterson那是因为`\ w`**匹配任何单词**字符(字母数字和下划线),而```实际上不是单词;)你可以使用`\ S`代替,**匹配任何字符**这不是空格**字符(空格,制表符,换行符等).http://regexr.com/3d9p5 (4认同)
  • 虽然这是一个很好的答案,但为什么它将“不是”包装为 2 个不同的词? (2认同)

Cli*_*key 10

如果您的元素内容包含子元素 (HTML),则上述解决方案没有用。

这是我提出的一个 jsfiddle,它保留了 HTML(元素及其属性)。这个小片段的缺点是,如果您将事件绑定到元素的内容,那么它们将丢失,因为 innerHTML 被重新分配给其他内容。

此代码不需要任何特殊库(如 jQuery)。

https://jsfiddle.net/4b5j0wjo/3/

var e = document.getElementById('words');
e.innerHTML = e.innerHTML.replace(/(^|<\/?[^>]+>|\s+)([^\s<]+)/g, '$1<span class="word">$2</span>');
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但是当子元素上有像“class”这样的属性时就会遇到问题。你知道如何修复吗? (2认同)