以下是一些示例代码:
<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不喜欢未打开的元素。
这里有任何帮助吗?
答案 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()
函数中识别它。