javascript - Chrome td 标签中 Html-form-elements 的 Onchange 事件

标签 javascript forms function google-chrome onchange

如何使用 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>

我知道可以将事件绑定(bind)到选择标签,但对于我的网络应用程序来说,它不会很好地工作

最佳答案

为什么 onchange 无法正常工作的原因是,变化的不是单元格,而是内部的表单元素。当然,如果您单击表格内容,该表格也会被单击。这是有道理的:如果不先打开前门,就无法打开房子内的门。
然而,你可以进入一个房间,剪头发(对自己触发一个改变事件),而不改变这个事件发生的房间。从这方面来说,更改事件不会在父单元格上触发是有道理的。

不过,事件确实遍历 DOM,并且它确实传递表格单元格,因此您可以在那里选取它,但是不包含 HTML 属性。 (顺便说一句:尽量少用它们)。

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

//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 中冒泡)。

几个链接:

关于javascript - Chrome td 标签中 Html-form-elements 的 Onchange 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470715/

相关文章:

javascript - 根据用户选择显示 Material ui TextField

php - Symfony2 : access raw form data in validator

javascript - 在 ReactJS 中将数组传递给另一个函数

python - 是什么导致我的函数最后返回 None?

javascript - PHP表单提交按钮但不离开页面

jQuery - 通过提交按钮操作值

Javascript "getSelection"仅当它位于某个 div 中时

javascript - 如何在 HTML5 Canvas 上翻转和旋转图像

javascript - Angular:将输入数字限制为两位小数的更好方法?

javascript - 带有 Form 和 $setPristine 的 Angular 1.5 组件