【问题标题】:Onchange event for Html-form-elements in td tag with Chrome使用 Chrome 的 td 标记中的 Html-form-elements 的 Onchange 事件
【发布时间】:2013-07-02 11:37:34
【问题描述】:

如何使用 Chrome 在表格单元格 (td) 中为表单标签调用 onchange 事件? 以下代码适用于除 chrome 之外的所有浏览器。令人惊讶的是它适用于 Opera 15(应该使用与最新的 Google Chrome 相同的引擎(webkit/blink))。

<table><tr>
    <td onchange="bla()">
        <select>
            <option value="n">foo</option>
            <option value="n">foo</option>
            <option value="n">foo</option>
            <option value="n">foo</option>
            <option value="n">foo</option>
        </select>
    </td>

    <td onchange="bla()">
        <input type="text" />
    </td>

    <td>
    </td>
</tr></table>



<script>
function bla() {
    alert('something changed...');
}
</script>

我知道可以将事件绑定到选择标签,但对于我的网络应用程序来说,它不会那么好

【问题讨论】:

    标签: javascript forms function google-chrome onchange


    【解决方案1】:

    whyonchange 不能正常工作的原因是,不是 cell 发生了变化,而是内部的表单元素。当然,如果您单击表格内容,也会单击该表格。这是有道理的:如果不先打开前门,您就无法打开房子内部的门。
    但是,您可以进入房间,剪头发(对自己发起更改事件),而无需更改发生此事件的房间。在这方面,更改事件不会在父单元格上触发是有道理的。

    事件确实遍历了 DOM,并且它确实传递了表格单元格,所以你可以在那里拾取它,但是不具有 HTML 属性。 (顺便说一句:尽量少用这些)。

    尝试在 JS 中将监听器绑定到整个表。这样,只有 1 个侦听器适用于所有事件(称为事件委托):

    //assume tbl has id foobar:
    document.getElementById('foobar').addEventListener('change',function(e)
    {
        e = e || window.event;
        var target = e.target || e.srcElement;
        var name = target.id || target.getAttribute('name');
        alert('the ' + name + ' element changed!');
    },false);
    

    Here's a slightly more complex version of event delegation,它还处理 IE8 中选择元素的更改事件。 (更改事件不会在旧 IE 中冒泡)。

    几个链接:

    【讨论】:

    • 因为这在我测试的所有其他浏览器中都有效,我认为这是一个 Chrome 错误,所以我正在寻找解决方法。但可以肯定。你说的都是有道理的。通常我不会在另一个标签上使用一个事件,然后是应该触发它的那个。
    • @Werner:嗯,我实际上是在建议你在不同的标签上听一个音,在你的情况下,你可以使用 either 表单,或document.body,甚至window...如果您的内容是动态生成的,这是确保正确处理事件的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多