<a href='link.html'>keyword</a>
私の質問は、 div のコンテンツ全体を置き換えずに、キーワードだけを に置き換える方法はありますか?
はい。これは、jQuery があまり提供しない (数少ない) 場所の 1 つです。
ただし、未加工の DOM API レベルでは、要素の実際のテキストを含むText
ノードには、ノードを特定の場所で隣接する 2 つのノードに分割できるsplitText
機能があります。したがって、あなたの場合、単語の先頭で分割し、単語の末尾で再度分割し、その中間Text
ノードを新しいアンカーでラップします。
以下に例を示します。ソース
HTML:
<input type="button" id="theButton" value="Make it a link">
<p id="example">This is the example paragraph.</p>
JavaScript:
jQuery(function($) {
$("#theButton").click(function() {
var targetWord, p, textNode, index, nodeWord, nodeAfter;
// Our target word
targetWord = "example";
// Get the paragraph using jQuery; note that after we
// use jQuery to get it (because it fixes getElementById for
// us on older versions of IE), we then use [0] to access
// the *raw* `p` element.
// Then get the text node from it.
p = $("#example")[0];
textNode = p.firstChild;
// Find our text in the text node
index = textNode.nodeValue.indexOf(targetWord);
if (index !== -1) {
// Split at the beginning of the text
nodeWord = textNode.splitText(index);
// Split the new node again at the end of the word
nodeAfter = nodeWord.splitText(targetWord.length);
// Insert a new anchor in front of the word
anchor = document.createElement('a');
anchor.href = "http://stackoverflow.com";
p.insertBefore(anchor, nodeWord);
// Now move the word *into* the anchor
anchor.appendChild(nodeWord);
}
});
});
当然、それを改善するためにやりたいことがいくつかあります。
index === 0
親要素の先頭に空のテキスト ノードを作成せずにケースを処理します。(無害ですが、理想的とは言えません。)
- 単語が親の最後にあるケースを処理して、そこに空のテキスト ノードが存在しないようにします。(また。)