3

I have the following problem and I have not found a way to solve it. I'm using a dynamically generated table, which consists of 4 columns: a checkbox, text values ​​and a hidden input.

echo "<tr><td><div class='input-containerh'><input type='checkbox'></div></td>";
echo "<td>" .$s. "</td>";
echo "<td>" .$L.  and some vars............    "</td>";
echo "<td><input type='hidden' value=" .  some vars.... "></td>";
echo "</tr>";

As I want to format the checkbox, because in some browsers the cell makes me too big, I use a DIV to format input (checkbox) and it works good for me.

Now the problem is a javascript function that detect if the input was select and now does not work me:

function deleteRow(tableID) {
        try {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;

        for(var i=1; i<rowCount; i++) {
            var row = table.rows[i];
            var chkbox = row.cells[0].childNodes[0];
            if(null != chkbox && true == chkbox.checked) {
                table.deleteRow(i);
                rowCount--;
                i--;
            }

Using firebug I found that the problem was:

var chkbox = row.cells[0].childNodes[0];

because it refers to "DIV" not at "input".

How i can reach the "input" element that is within "DIV" and also inside the cell?

Thanks for help.

Javier dc
  • 565
  • 6
  • 14

3 Answers3

3

Since the var chkbox = row.cells[0].childNodes[0] worked with this HTML:

<tr><td><input> type='checkbox'></td>

changing the HTML as follows:

<tr><td><div class='input-containerh'><input> type='checkbox'></div></td>

means that row.cells[0].childNodes[0] will now point to the div element. To get the input element inside div, you just access the next level of children with childNodes. So, in a nutshell, you can get access to your input with this:

var chkbox = row.cells[0].childNodes[0].childNodes[0];
Gezim
  • 7,112
  • 10
  • 62
  • 98
  • Hi, thank´s for response. but this does not work properly, text "type='checkbox'" is displayed. Apparently missing a "<" in your code not? – Javier dc Feb 03 '14 at 22:45
  • Response of – DontVoteMeDown - (and your) childNodes[0].childNodes[0] they runs ok. – Javier dc Feb 03 '14 at 23:01
2

(Just a comment)

If you use index to access child nodes, watch out:

<td><input ...></td>

behaves differently than

<td>
  <input ...>
</td>

In the first case, there is only one node in the td. In the second one, there are three: the first one is a text node containing end of line and two spaces, the second one is the HTMLInputElement and the third one is again text node containing end of line.

Brad Larson
  • 170,088
  • 45
  • 397
  • 571
Jan Turoň
  • 31,451
  • 23
  • 125
  • 169
  • For over 30 minutes I've been pulling my hair out for this answer. – amallard Aug 04 '16 at 07:07
  • @amallard there is also ParentNode.children property which returns live collection of nodes, skipping non-Element child nodes: https://developer.mozilla.org/en-US/docs/Web/API/ParentNode/children – Jan Turoň Mar 01 '18 at 09:55
1

This is what the HTML looks like, together with the JavaScript objects:

<tr><td><div class='input-containerh'><input type='checkbox'></div></td>
    ^
    |   ^
    |   +--- row.cells[0].firstChild
    |
    +------- row.cells[0]

As you can see, row.cells[0].firstChild points to the <div class="input-containerh">; so you need to go one further:

row.cells[0].firstChild.firstChild
Ja͢ck
  • 170,779
  • 38
  • 263
  • 309