简体   繁体   中英

Javascript appendChild(td) works one place, not another

Consider this HTML (part of a table in a form):

<tr id="EnterForRow">
    <td>Entered for</td>
    <td><input type="radio" name="enterfor" value "0" checked>Myself
        <input type="radio" name="enterfor" value "1">Someone Else </td>
</tr>
<tr id="PrayerForRow">
    <td>Prayer for </td>
    <td> <input type="radio" name="prayerfor" value="0" checked>Myself
         <input type="radio" name="prayerfor" value="1">Someone Else </td>
</tr>

When users click Someone Else , I have Javascript to make a new text input box appear on the row. The Javascript for PrayerForRow works but the Javascript for EnterForRow does not work. I can't see any obvious differences. I think I have been staring at it too long..

This works:

var prayforRad =  document.getElementsByName('prayerfor');

for(var i = 0; i < prayforRad.length; i++) 
{
    prayforRad[i].onclick = function() 
    {
        var theValue = radioValue(document.getElementsByName('prayerfor'));
        if (theValue == "1") 
        {
              if (!document.getElementById("pfor")) 
            {
                var newTd = document.createElement("td");
                newTd.setAttribute("id", "pfor");
                var pforRow = document.getElementById("PrayerForRow");
                pforRow.appendChild(newTd);
                newTd.innerHTML = '<td>For: <input type="text" name="PrayFor" id="PrayFor" size="25"></td>';
            }
        }
        else
        {
            if (document.getElementById("pfor")) 
            {
                var pforRow = document.getElementById("PrayerForRow");
                var pf = document.getElementById("pfor");
                pforRow.removeChild(pf);
            }
        }
    }
}

This does not:

var enterforRad = document.getElementsByName('enterfor');
for(var j = 0; j < enterforRad.length; j++) 
{
    enterforRad[j].onclick = function() 
    {
        var theValue2 = radioValue(document.getElementsByName('enterfor'));
        if (theValue2 == "1") 
        {
            if (!document.getElementById("efor")) 
            {
                var newTD2 = document.createElement("td");
                newTD2.setAttribute("id", "efor");
                var eforRow = document.getElementById("EnterForRow");
                eforRow.appendChild(newTD2);
                newTD2.innerHTML = '<td>For: <input type="text" name="EntFor" id="EntFor" size="25"></td>';
            }
        }
        else
        {
            if (document.getElementById("efor")) 
            {
                var eforRow = document.getElementById("EnterForRow");
                var ef = document.getElementById("efor");
                eforRow.removeChild(ef);
            }
        }
    }
}

Any pointers are appreciated.

<td><input type="radio" name="enterfor" value "0" checked>Myself
    <input type="radio" name="enterfor" value "1">Someone Else </td>

i think you have lost two "="

As I suggested in the comment, it is better to hide/display an existing element than creating those optional elements based on the condition like

<tr id="EnterForRow">
    <td>Entered for</td>
    <td>
        <input type="radio" name="enterfor" value="0" checked />Myself
        <input type="radio" name="enterfor" value="1" />Someone Else
    </td>
    <td id="efor" style="display: none">For:
        <input type="text" name="EntFor" id="EntFor" size="25" />
    </td>
</tr>
<tr id="PrayerForRow">
    <td>Prayer for</td>
    <td>
        <input type="radio" name="prayerfor" value="0" checked />Myself
        <input type="radio" name="prayerfor" value="1" />Someone Else
    </td>
    <td id="pfor" style="display: none">For:
        <input type="text" name="PrayFor" id="PrayFor" size="25" />
    </td>
</tr>

then

var prayforRad = document.getElementsByName('prayerfor');
for (var i = 0; i < prayforRad.length; i++) {
    prayforRad[i].onclick = function () {
        var theValue = radioValue(document.getElementsByName('prayerfor'));
        var pf = document.getElementById("pfor");
        pf.style.display = theValue == '1' ? '' : 'none'
    }
}

var enterforRad = document.getElementsByName('enterfor');
for (var j = 0; j < enterforRad.length; j++) {
    enterforRad[j].onclick = function () {
        var theValue2 = radioValue(document.getElementsByName('enterfor'));
        var ef = document.getElementById("efor");
        ef.style.display = theValue2 == '1' ? '' : 'none'
    }
}

Demo: Fiddle

Also I would recommend using addEventListener() to add the listener instead of using onclick property

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM