如何使用jQuery将<a></a>标签附加到元素中的特定单词

时间:2012-01-23 07:35:53

标签: javascript jquery

棘手的部分不是在这里选择元素,而是选择其中的文本。将为您提供文本内容的唯一真正的jQuery是.contents()。所以我得到的每个元素的内容都不是他的页面,我想挑出一个单词,比如“hashtag”。然后追加它。

我在这里做错了什么:

<html>
<p>
The word hashtag is in this sentence.
</p>
</html>

jQuery的:

$(function() {
    $('*')
        .contents()
        .filter(function(){
            return this.nodeType === 3;
        })
        .filter(function(){
            return this.nodeValue.indexOf('hashtag') != -1;
        })
        .each(function(){
            alert("It works!")
        });
});

$('*')抓住每个元素

.contents()抓取每个元素的内容

.filter(function(){ return this.noteType === 3;将其细化为元素的文本内容。 (#3节点类型是文本)

return this.nodeValue.indexOf('hashtag')应该抓住“hashtag”这个词。不确定这是否有效。

!= -1;应该阻止它抓取HTML中的每个元素。不确定那个。

为什么不起作用?我知道我还有附加标签,但是我可以选择“hashtag”这个词谢谢!

4 个答案:

答案 0 :(得分:2)

JS:

function replaceText() {
    $("*").each(function() {
        if($(this).children().length==0) {
           $(this).html($(this).text().replace('hashtag', '<span style="color: red;">hashtag</span>'));
        }
    });
}
$(document).ready(replaceText);
$("html").ajaxStop(replaceText);

HTML:

<html>
<p>
The word hashtag is in this sentence.
</p>
</html>

小提琴:http://jsfiddle.net/zCxsY/

来源:jQuery - Find and replace text, after body was loaded

这是用span完成的,但显然可以使用

答案 1 :(得分:2)

如果您想对整个页面执行此操作,您可以处理body元素的HTML:

$(function() {
    var regExp = new RegExp("\\b(" + "hashtag" + ")\\b", "gm");
    var html = $('body').html();
    $('body').html(html.replace(regExp, "<a href='#'>$1</a>"));
});

请注意,如果您的网页很大,这可能会很慢。此外,所有元素都将被重写,从而松散其事件处理程序等。

如果您不想要或者想要将替换限制为某些元素,您可以选择并迭代它们:

$(function() {
    var regExp = new RegExp("\\b(" + "hashtag" + ")\\b", "gm");
    $('div, p, span').each(function() {  // use your selector of choice here
        var html = $(this).html();
        $(this).html(html.replace(regExp, "<a href='#'>$1</a>"));
    });
});

答案 2 :(得分:0)

我不太了解jQuery,但我认为你不能只说.indexOf('hashtag'),你必须遍历文本本身。让我们说用子串。可能有一个jQuery函数会为你做这个,但这可能是你找到'hashtag'的问题。

答案 3 :(得分:0)

clean 变体将是:

$(function() {
    var searchTerm = 'hashtag';

    $('body *').contents()
    .filter(function () { 
        return this.nodeType == 3 
               && this.nodeValue.indexOf(searchTerm) > -1; 
    })
    .replaceWith(function () {
        var i, l, $dummy = $("<span>"),
            parts = this.nodeValue.split(searchTerm);

        for (i=0, l=parts.length; i<l; i++) {
            $dummy.append(document.createTextNode(parts[i]));
            if (i < l - 1) {
                $dummy.append( $("<a>", {href: "", text: searchTerm}) );
            }
        }
        return $dummy.contents();
    })
});

它将文本节点的值拆分为searchTerm,并将这些部分重新连接为新文本节点或<a>元素的序列。以这种方式创建的节点将替换相应的文本节点。

这样,所有文字值都保持其原始含义,当您在其上调用replace()并将其提供给.html()时(考虑包含HTML特殊字符的文字),无法保证这些值。

参见jsFiddle:http://jsfiddle.net/Tomalak/rGcxw/