У меня есть div, настроенный примерно так:
<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>
РЕДАКТИРОВАТЬ: Для пояснения, это самый простой пример.У div может быть любое произвольное число n глубоко вложенных дочерних элементов.
$('#test').getText()
возвращает «Hello Goodbye».Вот один вкладыш для тестирования в Firebug: jQuery('<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>').text()
Похоже, это связано с тем, что внутреннее использование jQuery, textContent (для не IE), возвращает скрытые элементы как часть текста.Хрмф.
Есть ли способ вернуть текстовое содержимое, игнорируя отображение: none'd элементы?По сути, я пытаюсь имитировать текст, который вы получите, выделив div мышкой и скопировав его в системный буфер обмена.Это игнорирует скрытый текст.
Интересно, что если вы создаете диапазон выделения и получаете из него текст, это также возвращает текст внутри дисплея: ни одного элемента.
var range = document.body.createTextRange();
range.moveToElementText($('#test')[0]);
range.select();
console.log(range.toString()); // Also logs Hello Goodbye!
Таким образом, создание диапазона выбора документа, по-видимому, не то же самое, что выделение мышью с точки зрения отображения: ни один элемент.Как мне обойти эту грязную загадку?
Редактировать: было предложено использовать .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
разрывы строк, пробелы и все, что происходит из \г \ п