#javascript #html
#javascript #HTML
Вопрос:
У меня возникли проблемы с извлечением текста, хранящегося в некоторых тегах абзаца. Я хочу выполнить итерацию по тегам с помощью цикла ‘for’, извлечь их и объединить в одну строку с именем ‘text’, а затем предупредить ее. Я почти уверен, что большая часть настроек выполнена правильно, но чего мне не хватает?
<div id = "myDiv">
<p> This is the first paragraph tag in the div.</p>
<p> I will try to loop through this div tag.</p>
<p> In order to get all of the elements used.</p>
<p> As well as the text in this div.</p>
</div>
<script>
var myDiv = document.getElementById("myDiv");
var pTags = myDiv.childNodes;
var text = ' ';
//creating iterator for pTags
for (var i = 0; i < pTags.length; i ;){
//check for nodeType == text type
if (pTags[i].nodeType == 3){
//combine nodevalue to one string
text = pTags[i].nodeValue;
}
}
//alert said string
alert(text);
</script>
Я хотел бы объединить все абзацы в одну строку, а затем предупредить эту строку или что-то сделать со строкой. Моя задача — взять все эти теги и что-то сделать с сохраненным текстом.
Комментарии:
1. я думаю, вы можете просто выполнить document.getElementById(«myDiv»).textContent
2. Добро пожаловать в stackoverflow. Во-первых, здесь ошибка:
for (var i = 0; i < pTags.length; i ;){
(вы должны удалить последнее ‘;’). После этого вы должны заменитьpTags[i].nodeValue
наpTags[i].textContent
3. Я попробовал то, что вы сказали, но в итоге получилась пустая строка >.<
Ответ №1:
Вы можете создать массив textContent
всех <p>
элементов непосредственно внутри #myDiv
с помощью строки запроса #myDiv > p
и, используя его второй параметр, сопоставить каждый узел с его textContent. Затем просто соедините этот массив любым разделителем, который вы хотите:
const arrOfPTexts = Array.from(
document.querySelectorAll('#myDiv > p'),
({ textContent }) => textContent
);
const text = arrOfPTexts.join(' ');
console.log(text);
<div id="myDiv">
<p> This is the first paragraph tag in the div.</p>
<p> I will try to loop through this div tag.</p>
<p> In order to get all of the elements used.</p>
<p> As well as the text in this div.</p>
</div>
Комментарии:
1. Спасибо! Я довольно новичок в JavaScript и не знаком с методом querySelector. Мне нужно будет разобраться в этом, чтобы понять это. Спасибо!
2.
querySelectorAll
просто выбирает все теги, соответствующие определенной строке селектора — он использует точно такой же синтаксис и логику, как в CSS.3. если вы не возражаете, не могли бы вы объяснить часть » , ({textContent}) => textContent);»? Как это связано с созданием массива? я предполагаю, что это как-то связано с настройкой того, что хранится в массиве, указывая на textContent тегов P.?
4. Второй параметр
Array.from
является необязательной функцией сопоставления, которая выполняется для первого параметра, подобного массиву, перед преобразованием во внешнийarrOfPTexts
.({ textContent })
извлекаетtextContent
свойство элемента и возвращает его — это означает, что результирующий массив представляет собой массивtextContent
значений, а не массив элементов. Другой способ:p => p.textContent
Ответ №2:
этого достаточно
alert(document.getElementById('myDiv').innerText);
<div id="myDiv">
<p> This is the first paragraph tag in the div.</p>
<p> I will try to loop through this div tag.</p>
<p> In order to get all of the elements used.</p>
<p> As well as the text in this div.</p>
</div>
Комментарии:
1. Я предполагаю, что innerText получает весь текст внутри выбранного элемента? Я должен попробовать это. Спасибо!
2. вы можете просто запустить Run Code SNippet там:D и да, он немного отличается от моего примера, хотя, поскольку в нем есть новые строки, но вы cna .replace (» n»,»») их