javascript - 第二次更改文本输入后未创建表行

标签 javascript

这是我的 HTML 代码:

<table id="display_table"><tr>
<td>No. of Questions:&nbsp;</td>
<td><input type="text" id="questions_num"></td>
</tr><tr>
<td>No. of Options:&nbsp;</td>
<td><input type="text" id="options_num"></td>
</tr></table>

我希望当用户在文本输入中输入x(其ID为options_num)时,x行将被创建。对于创建的每个新行,应该有一个左列和一个右列。左列将包含 "Option"+ somenumber,其中 somenumber 指已创建的行,右列将创建文本输入。

这是我在 JS 中尝试过的:

document.getElementById("options_num").onkeyup = function() {
    var options_num = parseInt(document.getElementById("options_num").value);
    var display_text = '<tr><td>No. of Questions:&nbsp;</td><td><input type="text" id="questions_num"></td></tr><tr><td>No. of Options:&nbsp;</td><td><input type="text" id="options_num"></td></tr>'
    for(var i = 1; i <= options_num; i++) {
        display_text += "<tr><td>Option " + i + ":&nbsp;</td><td>" + "<input type='text' id='option_" + i + "'</td></tr>";  
    }
    document.getElementById("display_table").innerHTML = display_text;
    document.getElementById("options_num").value = options_num.toString();
    document.getElementById("options_num").focus();
}

当我第一次在文本输入中输入一个值(其 id 为 question_num)时它会起作用,但是当我更改该值时,它不起作用(它不执行任何操作)。 Demo .

那么我如何让我的 JS 代码工作呢?

最佳答案

第一次之后它不起作用的原因是 innerHTML 实际上破坏了事件绑定(bind)。因此,在修改 table.innerHTML 后,浏览器会完全重建新的 DOM 元素,而无需附加原始 onkeyup 事件监听器。

我建议稍微更改一下 HTML,这会让一切变得更简单:

<table id="display_table">
    <tbody>
        <tr>
            <td>No. of Questions:</td>
            <td><input type="text" id="questions_num"/></td>
        </tr>
        <tr>
            <td>No. of Options:</td>
            <td><input type="text" id="options_num"/></td>
        </tr>    
    </tbody>
    <tbody id="rows"></tbody> <!-- append generated HTML here -->
</table>

和修改后的JS:

document.getElementById("options_num").onkeyup = function () {

    var options = document.getElementById("options_num"),
        optionsNum = parseInt(options.value),
        tbody = document.getElementById("rows"),
        rows = '';

    for (var i = 1; i <= optionsNum; i++) {
        rows += "<tr><td>Option " + i + "</td><td>" + "<input type='text' id='option_" + i + "'</td></tr>";
    }

    tbody.innerHTML = rows;
    options.focus();
}

因此,我们的想法是将表行放入 tbody 中,这样可以轻松添加新行和替换旧行。

演示:http://jsfiddle.net/8yYyW/2/

关于javascript - 第二次更改文本输入后未创建表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23241171/

相关文章:

javascript - 如何将 Handlebars 与 RequireJS 一起使用

javascript - 在随机超时完成多个函数后,如何运行语句?

javascript - 为什么不能刷新TinyMCE 中的文本?

javascript - redux saga 和 history.push

javascript - 摆脱在外部 JavaScript 文件中对 Web 应用程序的上下文路径进行硬编码

javascript - 在网站上播放多个不同音乐文件的能力

javascript - 在javascript中添加滚动条

javascript - 弹出窗口内的关闭按钮不响应(点击事件上的 jQuery)

javascript - 在 D3 中放置多个图表

根据另一个变量的 JavaScript 动态变量名称