#javascript #html
#javascript #HTML
Вопрос:
У меня есть следующая HTML
таблица, которую я пытаюсь просмотреть td's
<table id="review-products">
<thead>
<tr>
<th>Product</th>
<th class="currency">Base Value</th>
<th class="currency">Unit Price</th>
<th class="currency">Line Total</th>
<th class="currency">Quantity</th>
</tr>
</thead>
<tbody>
<tr id="order-item-510" class="tst-orderItemRow">
<td>
<label for="Name">
Some Cool Description <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="Value">
10 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="UnitPrice">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="LineTotal">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<span class="read-only">
1 <!-- Get this -->
</span>
</td>
</tr>
<tr></tr>
</tbody>
</table>
и извлеките заданное значение с помощью следующего javascript.
var table=document.getElementById('review-products');
for(var i=1; i<table.rows.length;i ){
var brand =(table.rows[i].cells[0]);
var baseValue =(table.rows[i].cells[1]);
var price =(table.rows[i].cells[2]);
var total =(table.rows[i].cells[3]);
var quantity =(table.rows[i].cells[4]);
var string1 = brand baseValue price total quantity;
console.log(brand);
}
К сожалению, поскольку у каждого td
есть label
тег или span
тег, он не возвращает то, что я ожидаю, т.е. текст. Вместо этого html
он возвращает мне то, что я пытался использовать innerHTML, однако это приводит к ошибке TypeError: невозможно прочитать свойство ‘innerHTML’ undefined.
Может кто-нибудь, пожалуйста, показать или рассказать мне, как я справляюсь с labels
span
тегами or, которые вложены внутри td's
, чтобы я мог правильно извлекать значения.
Я могу использовать только javascript
для этого.
Комментарии:
1.
var brand = table.rows[i].cells[0].querySelector("label").innerHTML
(и обратите внимание, что вам не нужны круглые скобки, которые у вас есть в каждой строке).2. @nnnnnn спасибо за информацию, однако при использовании querySelector я получаю следующую ошибку: не удается прочитать свойство querySelector неопределенного значения
3. Это из-за пустого tr в конце таблицы.
Ответ №1:
- Используется
Node.textContent
для полученияtext
контекстаNode
- Проверьте наличие
table.rows[i].cells.length
в цикле, так как у вас есть пустой<tr>
элемент.
var table = document.getElementById('review-products');
for (var i = 1; i < table.rows.length; i ) {
if (table.rows[i].cells.length) {
var brand = (table.rows[i].cells[0].textContent.trim());
var baseValue = (table.rows[i].cells[1].textContent.trim());
var price = (table.rows[i].cells[2].textContent.trim());
var total = (table.rows[i].cells[3].textContent.trim());
var quantity = (table.rows[i].cells[4].textContent.trim());
var string1 = brand baseValue price total quantity;
console.log(string1);
}
}
<table id="review-products">
<thead>
<tr>
<th>Product</th>
<th class="currency">Base Value</th>
<th class="currency">Unit Price</th>
<th class="currency">Line Total</th>
<th class="currency">Quantity</th>
</tr>
</thead>
<tbody>
<tr id="order-item-510" class="tst-orderItemRow">
<td>
<label for="Name">
Some Cool Description
<!-- Get this -->
</label>
</td>
<td class="currency">
<label for="Value">
10
<!-- Get this -->
</label>
</td>
<td class="currency">
<label for="UnitPrice">
$199.00
<!-- Get this -->
</label>
</td>
<td class="currency">
<label for="LineTotal">
$199.00
<!-- Get this -->
</label>
</td>
<td class="currency">
<span class="read-only">
1 <!-- Get this -->
</span>
</td>
</tr>
<tr></tr>
</tbody>
</table>
Ответ №2:
table.rows[i].cells[0]
дает вам ссылку на сам td. Чтобы добраться до элементов label и span, которые вы можете использовать table.rows[i].cells[0].querySelector("label")
, а для получения фактического текста вы можете использовать .innerHTML
или .innerText
.
Кроме того, хотя они не повредят, вам не нужны круглые скобки вокруг выражений с правой стороны в ваших назначениях.
Итак:
var brand =(table.rows[i].cells[0]);
становится:
var brand = table.rows[i].cells[0].querySelector("label").innerText;
И так далее.
Вам также нужно будет удалить пустой элемент tr в конце вашей таблицы, потому что в противном случае вы получите сообщение об ошибке, когда ваш цикл попытается получить доступ к его (несуществующим) ячейкам.
Разверните фрагмент, чтобы увидеть его в контексте:
var table=document.getElementById('review-products');
for(var i=1; i<table.rows.length;i ){
var brand = table.rows[i].cells[0].querySelector("label").innerText;
var baseValue = table.rows[i].cells[1].querySelector("label").innerText;
var price = table.rows[i].cells[2].querySelector("label").innerText;
var total =table.rows[i].cells[3].querySelector("label").innerText;
var quantity = table.rows[i].cells[4].querySelector("span").innerText;
var string1 = brand baseValue price total quantity;
console.log(string1);
}
<table id="review-products">
<thead>
<tr>
<th>Product</th>
<th class="currency">Base Value</th>
<th class="currency">Unit Price</th>
<th class="currency">Line Total</th>
<th class="currency">Quantity</th>
</tr>
</thead>
<tbody>
<tr id="order-item-510" class="tst-orderItemRow">
<td>
<label for="Name">
Some Cool Description <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="Value">
10 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="UnitPrice">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="LineTotal">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<span class="read-only">
1 <!-- Get this -->
</span>
</td>
</tr>
</tbody>
</table>
В качестве альтернативы, вы можете пропустить tds и использовать .querySelector()
для получения нужных битов более напрямую:
var brand = table.rows[i].querySelector('label[for="Name"]').innerText;
В контексте:
var table=document.getElementById('review-products');
for(var i=1; i<table.rows.length;i ){
var row = table.rows[i];
var brand = row.querySelector('label[for="Name"]').innerText;
var baseValue = row.querySelector('label[for="Value"]').innerText;
var price = row.querySelector('label[for="UnitPrice"]').innerText;
var total = row.querySelector('label[for="LineTotal"]').innerText;
var quantity = row.querySelector('span.read-only').innerText;
var string1 = brand baseValue price total quantity;
console.log(string1);
}
<table id="review-products">
<thead>
<tr>
<th>Product</th>
<th class="currency">Base Value</th>
<th class="currency">Unit Price</th>
<th class="currency">Line Total</th>
<th class="currency">Quantity</th>
</tr>
</thead>
<tbody>
<tr id="order-item-510" class="tst-orderItemRow">
<td>
<label for="Name">
Some Cool Description <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="Value">
10 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="UnitPrice">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="LineTotal">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<span class="read-only">
1 <!-- Get this -->
</span>
</td>
</tr>
</tbody>
</table>
(Конечно, такие селекторы, как label[for="Name"]
, немного уродливы, поэтому вы можете вместо этого присвоить этим элементам класс и использовать ...querySelector(".Name")
или что-то еще — на ваше усмотрение.)
Ответ №3:
Я реализовал приведенный ниже код, и я получаю правильные значения, вы можете это проверить.
<!DOCTYPE html>
<html>
<head>
<style>
table, td {
border: 1px solid black;
}
</style>
</head>
<body>
<table id="myTable">
<tr id="order-item-510" class="tst-orderItemRow">
<td>
<label for="Name">
Some Cool Description <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="Value">
10 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="UnitPrice">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<label for="LineTotal">
$199.00 <!-- Get this -->
</label>
</td>
<td class="currency">
<span class="read-only">
1 <!-- Get this -->
</span>
</td>
</tr>
</table>
<br>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction()
{
var table=document.getElementById('myTable');
var brand = "";
for(var i=0; i<table.rows.length;i )
{
brand = "<br/>" (table.rows[i].cells[0].innerHTML);
brand = "<br/>" (table.rows[i].cells[1].innerHTML);
brand = "<br/>" (table.rows[i].cells[2].innerHTML);
brand = "<br/>" (table.rows[i].cells[3].innerHTML);
}
document.getElementById("demo").innerHTML = brand;
}
</script>
</body>
</html>
Ответ №4:
Вы также можете использовать свойство .text() вместо этого в innerHTML оно выбирает значение внутри любого селектора, кроме входного тега.
brand = "<br/>" (table.rows[i].cells[0].text);
Ответ №5:
Ваша проблема в том, что вы пытаетесь обойти вложенные элементы DOM (т. Е. Имеете дело с промежутками и тегами), но следующее, что вы знаете, у вас есть абзац внутри td, и у вас снова та же проблема.
Лучше решить вашу проблему с помощью совершенно другого подхода. Я предлагаю улучшить имена классов для элементов, которые вы хотите отслеживать. Вы уже на правильном пути с классом ‘currency’:
<td class="currency">
<label class="value" for="Value">10</label>
</td>
...
<td class="currency">
<span class="value" class="read-only">
1
</span>
</td>
var elements = document.querySelectorAll('.value')
elements.forEach(function(element) {
console.log(element.textContent)
})
Комментарии:
1. Зачем вам использовать Sizzle, когда вы можете использовать
document.querySelectorAll(".value")
?2. Удалена рекомендация Sizzle