我有一个 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