我的问题是,有没有办法只用 替换关键字<a href='link.html'>keyword</a>
,而不替换 div 的全部内容?
是的。这是 jQuery 并没有真正为您提供太多的(少数)地方之一。
但是,在原始 DOM API 级别,包含元素实际文本的Text
节点具有一个splitText
函数,您可以使用该函数将节点拆分为特定位置的两个相邻节点。因此,在您的情况下,您将在单词的开头拆分,然后在单词的结尾再次拆分,然后将该中间Text
节点包装在一个新的锚点中。
这是一个示例:Live copy | 来源
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
情况,而不在父元素的开头创建空文本节点。(无害,但不太理想。)
- 处理单词位于父级末尾的情况,这样您就不会在那里得到一个空的文本节点。(再次。)