【发布时间】:2012-11-25 07:16:56
【问题描述】:
假设我有这个 div:
<div> Let's say these are the words in my div </div>
我知道我可以通过这种方式将 div 中的每个单词包装成一个 span
$("div").contents().wrap('<span class="wrapper"/>');
//output: <div><span class="wrapper"> Let's say these are the words in my div</span> </div>
但是,我想实现这一目标:
<div>
<span class="wrapper">Let's say these</span>
<span class="wrapper">are the words</span>
<span class="wrapper">in my div</span>
</div>
每个特定数量的单词(本例:每3个单词)分成一组,每组单词单独包装。 p>
这些是我首先想到的:
1)我认为可以通过text()获取字符串和split(' ')组成一个数组,每个元素包含一个单词,写一个while循环来操作数组:
var a = 0;
var b = array.length;
while (a<b) {
array[a] = "<span class="wrapper>" + array[a]";
a +=2;
if (a>b) {
a = b-1;
}
array[a] = array[a] + "</span>";
a++;
}
那么只需简单地将.join('')数组和$("div").html(string)组成一个字符串;
2) 或者我可以在用text()获取后简单地使用正则表达式:
全局搜索包含a word + a space + a word + a space + another word的表达式
/(\w+\s+\w+\s+\w+)/g
将其替换为包裹在跨度中的内容
<span>$1</span>
和html() 在执行$("div").contents().eq(2).wrap('<span class="wrapper"/>') 之前的输出,如果有奇数输出。
这些是我想出的,我想知道,除了这些还有更好的方法吗?
实现它的最佳方法是什么(最快且需要最少的内存)?
【问题讨论】:
-
我认为连接版本会更快,因为它没有运行“复杂”的正则表达式计算,但是,据我了解(并像我一样用一粒盐) t 自己运行测试),在 JS 中运行多个连接是一个非常昂贵的过程(我相信我在eloquentjavascript.net 中读到了这个)。所以是的,我没有答案。 :)
-
如果你写的东西成功了,它可能会比 jQuery 版本更快,但你也需要考虑在开发人员大脑中“执行”什么。跨度>
-
@greg5green 是的,当然:)
-
Arch,最好使用 jQuery 之类的框架来处理 DOM 内容,因为它可以处理较旧的
document.layers(NS4) 和document.all(IE4) 实现。我知道它会影响 1/1,000,000 的用户,但实际上并没有增加多少开销,并确保了可靠性。 -
Arch:还是用直接的 DOM 版本更新了我的答案,供您参考:)
标签: javascript jquery string performance