jQuery.next在没有选择器的文本片段上

时间:2010-06-05 03:37:57

标签: jquery jquery-selectors

以下是一些示例代码:

<input type="checkbox" id="send-notice" name="send-notice" value="1" /> This is a notice to all users.  

<label for="subject">Subject</label>

我希望能够选择文字“这是对所有用户的通知。”,以便我可以将其删除。

我不知道该怎么做。

我已尝试使用jQuery('#send-notice').next(),但会选择<label for="subject">阻止。

我还尝试使用<div>jQuery('#send-notice').after()上的结束</div>标记在文本周围包裹jQuery("label[for='subject']").before()。但jQuery不喜欢未打开的元素。

这里有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

jQuery在这里不会有太大的帮助,因为它的优势在于遍历DOM,并且你没有一个节点可以遍历这里。

我怀疑你可能做的最好的事情就像......

var html = $('#parent-element').html();
html = html.replace("This is a notice to all users", '');
$("#parent-element").html(html);

那就是:蛮力替换文本。如果您想要对文本更改进行一点保护,可以使用一些简单的模式匹配。

var html = $('#parent-element').html();
html = html.replace(/<input type="checkbox" id="send-notice" name="send-notice" value="1" />.*?</, '');
$("#parent-element").html(html);

答案 1 :(得分:1)

你想对文本节点进行操作,jQuery避开了文本节点。由于您无法在跨度或类似内容中包装要更改的文本,因此您可以通过一些努力识别文本节点并进行一些手术。这很快就被抛在了一起,但似乎有效:

    /* utility function to help us skip whitespace-only nodes */    
    function isWhitespace( thenode ) {
        return !(/[^\t\n\r ]/.test( thenode.data ));
    }   

    /* attach this function to ready() or other trigger */
    function fixtext(){
        $('div#main')
            .contents()
            .filter( function() {
                return !isWhitespace(this) && this.nodeType == 3;
                // nodeType 3 means textNode. Force jQuery to ingest.
            })
            .each( function(){
                $(this).replaceWith( document.createTextNode('Your new text') );
            });
    }

这当然可以减少和简化,但似乎可以使用您问题中的信息,并且应该为您提供方法的起点。它不依赖于完全匹配你的字符串 - 只是字符串将被放置在一个更大的容器中(我在这里有div#main),并且它不会有任何非空白兄弟。即使您的案例更复杂,只要文本始终如一,您就应该能够在filter()函数中识别它。