div に子要素が含まれていないと仮定した簡単な例から始めて、次のようにすることができます。
function wrapText(id, offset, length){
$("#"+id).html(function(i,oldHtml) {
return oldHtml.substr(0,offset) +
"<span>" +
oldHtml.substr(offset, length) +
"</span>" +
oldHtml.substr(offset + length);
});
}
wrapText("pie1",5,6); // obviously use values from your JSON here
デモ: http://jsfiddle.net/TfAAC/
コールバック関数でjQuery の.html()
メソッドを呼び出すと、jQuery は現在の html テキストで関数を呼び出し、新しい値を返します。
次のより複雑なコードは、div 内に子要素がある場合に「機能」しますが、span タグを挿入するときにタグが重複する可能性があります。
function wrapText(id, offset, length){
$("#"+id).html(function(i,oldHtml) {
var i, c, spanStart, spanStop;
for (i = 0, c = 0; i < oldHtml.length; i++) {
if (c === offset)
spanStart = i;
else if (c === offset+length) {
spanStop = i;
break;
}
if (oldHtml.charAt(i) === "<"){
while (++i < oldHtml.length && oldHtml.charAt(i) != ">" && oldHtml.charAt(i+1) != "<");
}else
c++;
}
if (spanStart === undefined)
return oldHtml;
if (spanStop === undefined)
spanStop = oldHtml.length;
return oldHtml.slice(0, spanStart) +
"<span>" + oldHtml.slice(spanStart, spanStop) + "</span>" +
oldHtml.slice(spanStop);
});
}
このデモで見ることができます: http://jsfiddle.net/TfAAC/1/上記によって生成された html には「適切な」場所にスパンタグがありますが、ブラウザーが実際にそれを表示すると、それは好きではありません (少なくとも、Firefox はそうではありません) オーバーラップのためです。