Próbuję uzyskać wartość 0.51 z poniższej tabeli:

HTML:

<div id=myDiv">    
<table class="myTable">
        <tbody>
            <tr>
                <td>Text1:</td>
                <td class="data"><strong>0.51</strong></td>
            </tr>
            <tr>
                <td>Text2:</td>
                <td class="data"><strong>2199</strong></td>
            </tr>
        </tbody>
    </table>
</div>

JavaScript:

var foo= document.getElementById("myDiv").getElementsByClassName("myTable").getElementsByTagName("td")[0]
var other=foo.innerText

Jednak następujący kawałek kodu:

document.getElementById("myDiv").getElementsByClassName("myTable").getElementsByTagName("td")[0]

Zwraca błąd:

TypeError: Object #<NodeList> has no method 'getElementsByTagName'

Co ja robię źle?

-1
Nuno Nogueira 23 listopad 2013, 01:36

1 odpowiedź

Najlepsza odpowiedź

To dlatego, że (z przeprosinami) NodeList Obiekty nie mają metody o nazwie getElementsByTagName.

Rozbijmy to:

document.getElementById("myDiv")

Znajduje pojedynczy element z id "myDiv".

.getElementsByClassName("myTable")

Znajduje lista elementów, które mają klasę "myTable".

.getElementsByTagName("td")[0]

... zawiedzie, ponieważ lista nie ma metody o nazwie getElementsByTagName.

Poszczególne elementy na liście z getElementsByClassName mają metodę, ale nie lista.

Na przykład użyję tego pierwszego elementu najpierw z klasy {x0}}:

var foo= document.getElementById("myDiv").getElementsByClassName("myTable")[0].getElementsByTagName("td")[0]
// Change here ------------------------------------------------------------^^^

Ale jesteś lepszy z nowszym (ale lepiej obsługiwany) querySelector i querySelectorAll. W tym przypadku:

var foo = document.querySelector("#myDiv .myTable td");

... dałoby ci pierwszy td w pierwszej .myTable wewnątrz #myDiv i

var foo = document.querySelectorAll("#myDiv .myTable td");

... Dałoby Ci listę wszystkie elementy {x0}} w wszystkie elementy {x1}} w #myDiv.

querySelector / querySelectorAll są obsługiwane w IE8, podczas gdy {x2}} nie jest.

3
T.J. Crowder 22 listopad 2013, 21:58