【发布时间】:2011-11-14 23:50:48
【问题描述】:
我有一个这样的 div 设置:
<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>
编辑:澄清一下,这是最简单的例子。 div 可以有任意数量的 n 个深度嵌套的子级。
$('#test').getText() 返回“你好,再见”。这是在 Firebug 中测试的一个衬里:jQuery('<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>').text()
这似乎是因为 jQuery 内部使用的 textContent(对于非 IE)返回隐藏元素作为文本的一部分。哼。
有没有办法返回忽略 display:none'd 元素的文本内容?基本上,我试图模仿用鼠标突出显示 div 并复制到系统剪贴板的文本。这会忽略隐藏的文本。
有趣的是,如果您创建一个选择范围并从中获取文本,那么它也会在 display:none 元素中返回文本。
var range = document.body.createTextRange();
range.moveToElementText($('#test')[0]);
range.select();
console.log(range.toString()); // Also logs Hello Goodbye!
因此,就 display:none 元素而言,创建文档选择范围似乎与用鼠标突出显示不同。我该如何解决这个肮脏的泡菜难题?
编辑:建议使用.filter(':visible').text,但它不适用于这种情况。我需要返回的文本与鼠标选择的内容完全相同。比如:
$('<div>test1 <p>test2</p>\r\n <b>test3</b> <span style="display:none">none</span></div>').appendTo(document.body).children().filter(':visible').text()
返回
"test2test3"
当我真正想要的输出是
test1 test2
test3
换行符、空格和所有,来自\r\n
【问题讨论】:
标签: javascript jquery innertext