0

假设我有一些这样的 HTML:

<div id="text">This <i>is</i> a <b>test</b>. Do <i>not</i> be <b>alarmed</b>.</div>

我想用 jQuery 去掉第一句话,那就是This <i>is</i> a <b>test</b>.

我知道如何.text()删除文本,然后.indexOf()找到第一个句点,这样我就知道第一句话的结尾在哪里,但我不知道如何在保持 HTML 格式的同时做到这一切。现在,我有一个非常混乱的解决方案,它使用循环通过节点等的常规 JavaScript。但是,当我在格式中获得<a>链接时,事情开始变得有点混乱。<b>

4

2 回答 2

4
$("#text").mouseover(function(event) {
   alert($(this).html().split(".")[0]+".");
});

也许我对您的理解不正确,但这可能就这么简单。

于 2011-03-04T07:57:16.597 回答
2

我正在创建一个新的答案而不是评论,因为这是我自己的问题的可能答案,我在玩了一会儿之后才创建了这个问题。(正如我之前提到的,我之前的尝试没有涉及 jQuery,并且也有太多问题。)不过,我希望得到反馈,因为它可能会针对特定情况进行一些调整。我使用 HTML 字符串而不是 jQuery 对象作为输入,因为我需要先去除<b>标签的 HTML,而且我发现它更容易使用,.replace而不是遍历每个节点来执行此操作。我可能会尽快解决这个问题。

到目前为止,以下代码运行良好。如果它在标签内,它甚至会找到第一个句点,例如a <b>test.</b>,并相应地删除后续节点。但是,如果是a <b>test. Blah</b>这样,它将保留,Blah因为下面的代码当前没有深入挖掘以正确删除.位于另一个节点内的文本。

HTML:

<div id="text">This <i>is</i> a <b>test</b>. Do <i>not</i> be <b>alarmed</b>.</div>

JavaScript:

$('#text').replaceWith(firstSentenceOnly($('#text').html().replace(/<(b|strong)>(.*?)<\/(b|strong)>/gi, '$2')));

function firstSentenceOnly(node)
{
    // Convert to jQuery object
    if (typeof(node) == 'string')
        node = $('<div>' + node + '</div>');

    var periodFound = false;

    node.contents().each(function()
    {
        if (periodFound == true)
        {
            $(this).remove();
        }
        else if ($(this).text().indexOf('.') != -1)
        {
            periodFound = true;

            if ($(this)[0].nodeValue && $(this)[0].nodeValue.indexOf('.') != -1)
            {
                $(this)[0].nodeValue = $(this)[0].nodeValue.substring(0, $(this)[0].nodeValue.indexOf('.') + 1);
            }
        }
    });

    return node;
}
于 2011-03-05T04:15:00.890 回答