【问题标题】:JavaScript DOM insertBefore isn't working properlyJavaScript DOM insertBefore 无法正常工作
【发布时间】:2013-11-13 04:26:17
【问题描述】:

这是我的第一个问题,请原谅我的错误。

我正在尝试通过 JavaScript 向表中添加行。新添加的行将添加到倒数第二个位置,最后一行包含创建新行的按钮。最后一行的 id 为“submitrow”,但获取该元素并将其传递给 insertBefore 不知何故不起作用。将 lastChild 作为第二个参数传递给 insertBefore 也很奇怪。

在正文中,格式如下:

<form>
    <input type="hidden" name="submit_done" value="true" />
    <table id="formtable">
        <tr>
            <td>Number : </td>
            <td><input type="text" name="num[]" /></td>
        </tr>
        <tr id="submitrow">
            <td><input type="button" value="Add one more" onclick="addRow()" /></td>
            <td><input type="submit" value="Go!" /></td>
        </tr>
    </table>
</form>

这里是 JavaScript 函数:

function addRow(){
    var new_tr  = document.createElement('tr');
    var new_td1     = document.createElement('td');
    var new_td2     = document.createElement('td');
    var new_input   = document.createElement('input');

    new_td1.innerHTML = 'Number : ';

    new_input.type = 'text';
    new_input.name = 'num[]';
    new_td2.appendChild(new_input);

    new_tr.appendChild(new_td2);
    new_tr.insertBefore(new_td1, new_td2);

    var formtable   = document.getElementById('formtable');
    var submitrow   = document.getElementById('submitrow');
    submitrow.style.backgroundColor='red'; /*Works fine, paints button row red*/
    formtable.insertBefore(new_tr, submitrow); /*fails, invalid argument*/
}

现在,问题是:

  1. insertBefore 在最后一行失败。请注意,在 new_tr 对象上也已尝试过 insertBefore,它工作正常。所以唯一可能的无效参数可以是 submitRow,在失败的语句上方仅一行被成功地涂成红色。

  2. 如果对于失败的调用,而不是submitrow,如果使用formtable.lastChild,它会运行。但是不知何故 lastChild 也包括上排。这意味着,如果我再输入 4 行并在测试输入中输入 1、2、3、4、5,然后如果您点击“再添加一个”按钮,那么现在在 4 到 5 之间添加了一行!

我已经尝试了很多推理,但无法理解这两种情况背后的逻辑。

希望有解决办法,谢谢大家,

Abhay Bhave,印度

【问题讨论】:

    标签: javascript dom


    【解决方案1】:

    标题应该在“JavaScript DOM insertBefore is not used正确”中更改。

    这是因为,即使您没有放入 DOM,浏览器也会自动创建一个 &lt;tbody&gt; 元素来包装表格的行。因此,#formtable 碰巧不是#submitrow 的父级,这就是您收到错误的原因。

    试试这个:

    formtable.tBodies[0].insertBefore(new_tr, submitrow);
    

    或者,更一般地说:

    submitrow.parentNode.insertBefore(new_tr, submitrow);
    

    (在支持它的浏览器中,甚至还有这个:

    submitrow.insertAdjacentElement("beforeBegin", new_tr);
    

    Internet Explorer、Chrome、Safari 和 Opera 支持它,Firefox 不支持,但它可以轻松填充。无论如何,我不建议使用这些东西。)

    并且,作为一般建议,始终在写下表格时使用&lt;tbody&gt; 标签:

    <table id="formtable">
        <tbody>
            <tr>
                <td>Number : </td>
                <td><input type="text" name="num[]" /></td>
            </tr>
            <tr id="submitrow">
                <td><input type="button" value="Add one more" onclick="addRow()" /></td>
                <td><input type="submit" value="Go!" /></td>
            </tr>
        </tbody>
    </table>
    

    当然还有&lt;thead&gt;&lt;tfoot&gt;,如果你需要的话。

    【讨论】:

    • 这就是我喜欢这个地方的原因;)非常感谢,MaxArt...没有更多问题了。
    猜你喜欢
    • 2023-03-27
    • 2013-10-10
    • 2012-12-18
    • 2015-02-24
    • 2018-12-07
    • 2015-05-23
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多