我有以下代码:
<table>
<th class="title2">The <i>very</i> hungry school</th><br />
<th class="title2">The very hungry school <span>yeah it works</span></th>
和..
function capitalise(str) {
if (!str) return;
var counter = 0;
var stopWords = ['a', 'an', 'and', 'at', 'but', 'by', 'far', 'from', 'if', 'into', 'of', 'off', 'on', 'or', 'so', 'the', 'to', 'up'];
str = str.replace(/\b\S*[a-z]+\S*\b/ig, function(match) {
counter++;
return $.inArray(match, stopWords) == -1 || counter === 1 ? match.substr(0, 1).toUpperCase() + match.substr(1) : match;
});
return str;
}
$('th.title2').each(function() {
var capclone = $(this).clone().children(':not(i)').remove().end();
capclone.text(capitalise(capclone.text()));
capclone.append($(this).children(':not(i)'));
$(this).replaceWith(capclone);
});
此代码适用于我需要它执行的操作,但是有一种方法可以维护斜体元素。目前它被删除,这不是一个糟糕的解决方案,但它并不完美。
答案 0 :(得分:1)
如果不是使用text()
使用html()
来获取html,因为它是元素,然后是大写每个单词。我将正则表达式略微简化为/\b\w+\b/ig
,它将匹配单词边界,后跟一个或多个字符和单词边界。这也将匹配html标记中的初始字符,但不应导致任何问题。而不是克隆和替换节点我只是更新html,它应该更快,因为它在DOM交互上更轻。
function capitalise(str) {
if (!str) return;
var stopWords = ['a', 'an', 'and', 'at', 'but', 'by', 'far', 'from', 'if', 'into', 'of', 'off', 'on', 'or', 'so', 'the', 'to', 'up'];
str = str.replace(/\b\w+\b/ig, function(match) {
return $.inArray(match, stopWords) == -1 ? match.substr(0, 1).toUpperCase() + match.substr(1) : match;
});
return str;
}
$('th.title2').each(function() {
var capclone = $(this), newHtml = capitalise(capclone.html());
capclone.html(newHtml);
});
您可以使用此fiddle中的代码。