我需要替换div内容中的第一个字母并用<span>
标记包装。
这是我的HTML:
<div class="first_ltr">
<p>This is a Test </p>
</div>
我想以以下形式替换html:
<div class="first_ltr">
<p><span>T</span>his is a Test </p>
</div>
我试过了:
$(".first_ltr").each(function () {
var currentText = $(this).html();
$(this).text(currentText.replace("0","<span></span>"));
});
任何人都可以帮忙吗?在此先感谢您的帮助。
答案 0 :(得分:8)
您可以传递给.html回调,并将任何标记添加到文字中,如此
$('.first_ltr p').html(function (index, html) {
return '<span>' + html.slice(0, 1) + '</span>' + html.slice(1);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first_ltr">
<p>This is a Test </p>
</div>
html.slice(0, 1)
- 返回字符串
html.slice(1)
- 返回没有第一个字母的字符串
<强>更新强> 我写过小插件,你可以尝试一下
$.fn.wrapText = function (tag, position) {
var $contaiter = $('<div />');
this.html(function (index, html) {
var start = position;
end = position + 1;
if (position > html.length) {
position = 0;
}
$contaiter.html($('<' + tag + '/>').html(html.slice(start, end)));
return [html.slice(0, start), $contaiter.html(), html.slice(end)].join('');
});
};
$('.first_ltr p').wrapText('span', 0);
$('.last_ltr p').wrapText('div', 13);
答案 1 :(得分:1)
检查以下代码。检查DEMO
第一个选项
$(".first_ltr").each(function () {
var currentText = $.trim($(this).text());
var firstChar = currentText.charAt(0);
currentText = currentText.substring(1, currentText.length);
$(this).find('p').html('<span>'+firstChar+'</span>'+currentText);
});
的第二个选项
$(".first_ltr").each(function () {
var currentText = $.trim($(this).text());
$(this).find('p').html('<span>'+currentText.slice(0,1)+'</span>'+currentText.slice(1));
});
答案 2 :(得分:1)
不是最短的解决方案,但它适用于每个文本:
var $span = $('<span />');
$(".first_ltr > p").each(function(){
var firstLetter = $(this).text().slice(0,1); //find first letter
var text = $(this).text().slice(1); //find rest of the text
$span.text(firstLetter); //wrap first letter in span-tag
$(this).text(text); //override old text
$(this).prepend($span); //prepend first letter
});
答案 3 :(得分:1)
这样的事情对你有用。
var text = $('.first_ltr p').text();
var split = text.split('');
var firstLetter = split[0];
var rest = split.splice(1,split.length)
$('.first_ltr p').html('<span>' + firstLetter +'</span>' + rest.join(''));
答案 4 :(得分:1)
这是一个可能的解决方案:
$(document).ready(function(){
var myText = $('.first_ltr > p').text();
var start = '<span>' + myText.slice(0,1) + '</span>';
var end = myText.slice(1, myText.length);
$('.first_ltr > p').html(start + end);
});
演示:http://jsfiddle.net/r2zp2vqm/1/
希望有所帮助!
答案 5 :(得分:-1)
我的第一次回答尝试相当天真:
$(".first_ltr p:first").each(function () {
var currentText = $(this).html();
$(this).html(currentText.replace(/(.)/,"<span>$1</span>"));
});
答案有多个问题:
<p>
不存在,它会中断。<p>
内(可能包裹标签的<
),它会更加突破。为了解决这些问题,这里有一个很大改进的尝试:
var validLetters = "a-zA-Z";
var rgx = new RegExp( "^([\\s\\S]*?)([" + validLetters + "])" );
$(".first_ltr").each( function() {
// 1) Find the first text node
var node = $(this);
while( node.contents().length ) {
node = node
.contents()
.filter(function() {
return $(this).text().match(rgx);
}).first();
}
// 2) Make sure it is a text node
if( node.length && node[0].nodeType === 3 )
{
// 3) Get first valid character
var firstLetter = $(node).text().match(rgx);
// 4) Remove it from the old text
node[0].nodeValue = $(node).text().substring(firstLetter[0].length);
// 5) Add the span
$(node).before(firstLetter[1] + "<span>" + firstLetter[2] + "</span>");
}
});
&#13;
span { background: yellow; }
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first_ltr">
<p>This is a Test </p>
</div>
&#13;
对于像OP这样的简单案例,这可能是矫枉过正,但对其他案件则更灵活。
这是一个包含更多测试用例的小提琴:https://jsfiddle.net/abfsefpz/2/
答案 6 :(得分:-4)