"input"元素的"change"和"input"事件之间的区别

Gab*_*vay 93 javascript jquery events dom

有人能告诉我changeinput事件之间有什么区别吗?

我正在使用jQuery添加它们:

$('input[type="text"]').on('change', function() {
    alert($(this).val());
})
Run Code Online (Sandbox Code Playgroud)

它也适用于input而不是change.

也许在相关焦点的事件排序方面存在一些差异?

Ion*_*zău 96

根据这篇文章:

  • oninput 当通过用户界面更改元素的文本内容时发生事件.

  • onchange选择,检查状态或元素内容发生变化时发生.在某些情况下,它仅在元素失去焦点时发生.该onchange属性可以使用:<input>,<select>,和<textarea>.

TL; DR:

  • oninput:文本内容中的任何更改
  • onchange:
    • 如果是<input />:改变+失去焦点
    • 如果是<select>:更改选项

$("input, select").on("input", function () {
    $("pre").prepend("\nOn input. | " + this.tagName);
}).on("change", function () {
    $("pre").prepend("\nOn change | " + this.tagName);
}).on("focus", function () {
    $("pre").prepend("\nOn focus | " + this.tagName);
}).on("blur", function () {
    $("pre").prepend("\nOn blur | " + this.tagName);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" />
<select>
  <option>Alice</option>
  <option>Bob</option>
  <option>Carol</option>
  <option>Dave</option>
  <option>Emma</option>
</select>
<pre></pre>
Run Code Online (Sandbox Code Playgroud)

  • @JustinMorgan在JSFiddle示例中,`onchange`在"元素失去焦点时"发生,而"oninput"在每次文本更改时发生. (9认同)
  • 我还不清楚两者之间的区别.它们与您的描述非常相似. (7认同)
  • 不同之处在于 oninput 事件在元素值改变后立即发生,而 onchange 在元素失去焦点时发生,内容发生改变后。 (2认同)

aki*_*uri 24

看来这个问题已经成为我时常访问的问题之一。我不喜欢为了简单的事情而阅读文字墙。所以我决定发布一个实用的答案。

使用以下演示,我们可以检查哪些事件被触发以及以什么顺序触发。

演示截图

let eventsToListen = [
    "focus",
    "blur",
    "input",
    "change",
];
let inputs = Array.from(
    document.querySelectorAll("#inputs :is(input, textarea, select)")
);
inputs.forEach(input => {
    input.eventQueue = [];
    let queueLimit = eventsToListen.length * 2;
    let queueDisplay = input.closest("td").nextElementSibling;
    eventsToListen.forEach(event => {
        input.addEventListener(event, () => {
            input.eventQueue.push(event);
            if (input.eventQueue.length > queueLimit) {
                Array(input.eventQueue.length - queueLimit).fill(null).forEach(
                    _ => input.eventQueue.shift()
                );
            }
            queueDisplay.textContent = input.eventQueue.join(", ");
        });
    });
});
Run Code Online (Sandbox Code Playgroud)
* {
    margin: 0;
    padding: 0;
    box-sizing: inherit;
    color: inherit;
    font-size: inherit;
    font-family: inherit;
    line-height: inherit;
}
body {
    font-family: sans-serif;
    box-sizing: border-box;
    background-color: hsl(0, 0%, 90%);
}
#inputs {
    margin: 1em;
}
#inputs td {
    padding: 0.1em;
}
#inputs td:nth-child(2) :not(input[type=radio]):not(input[type=checkbox]) {
    width: 100%;
}
#inputs label {
    display: table;
}
#inputs td:last-child {
    font-style: italic;
    font-size: 0.8em;
    opacity: 0.7;
    padding-left: 1em;
}
#notices {
    margin: 1em;
}
#notices ul {
    padding-left: 2em;
    line-height: 2;
}
#notices > ul {
    margin-top: 0.5em;
}
input[type=radio]:focus,
input[type=checkbox]:focus {
    transform: scale(1.5);
}
Run Code Online (Sandbox Code Playgroud)
<table id="inputs">
    <tr>
        <td>text</td>
        <td><input type="text" /></td>
        <td></td>
    </tr>
    <tr>
        <td>number</td>
        <td><input type="number" /></td>
        <td></td>
    </tr>
    <tr>
        <td>textarea</td>
        <td><textarea></textarea></td>
        <td></td>
    </tr>
    <tr>
        <td>select</td>
        <td>
            <select>
                <option>-</option>
                <option>Option 1</option>
                <option>Option 2</option>
                <option>Option 3</option>
            </select>
        </td>
        <td></td>
    </tr>
    <tr>
        <td rowspan="2">radio</td>
        <td>
            <label><input type="radio" name="something" /> Option 1</label>
        </td>
        <td></td>
    </tr>
    <tr>
        <td>
            <label><input type="radio" name="something" /> Option 2</label>
        </td>
        <td></td>
    </tr>
    <tr>
        <td style="padding-right: 0.5em">checkbox</td>
        <td>
            <label><input type="checkbox" name="something2" /> Option 1</label>
        </td>
        <td></td>
    </tr>
</table>

<hr>

<div id="notices">
    notice that:
    <ul>
        <li>"input" event can occur multiple times before a "change" event occurs on text/number/textarea</li>
        <li>"input" and "change" event seem to occur together/sequentially on select</li>
        <li>"input"/"change" event might occur multiple times before a "blur" event occurs on select
            <ul>
                <li>when arrow keys are used to select an option</li>
            </ul>
        </li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 23

  • change event大多数浏览器火灾时,内容变更和元素丢失focus,基本上变化的集合.你不会看到这个被解雇的每一个改变不像input event.

  • 同时input event触发元素内容的变化.所以你会看到这个事件更频繁地发生.浏览器支持各不相

  • @TimDown,这就是我说浏览器支持各不相同的原因.不是每个人都拥有每个浏览器的当前版本. (2认同)

zco*_*p98 8

这两个事件之间最显著的区别是什么原因引起value上的变化<input>

根据MDN

input事件触发时value<input><select><textarea>元件已被更改。

又名,

input触发任何时间value变化。

change 有点复杂:

当用户提交对元素的更改时,change将针对<input><select><textarea>元素触发该事件value。与input事件不同的change是,不一定每次更改元素的value.

换句话说,

change用户更改value.

当正是它激发依赖于type<input>

为了...

  • “收音机”和“复选框”:
    • 当元素为 时:checked,通过键盘或鼠标单击
  • “日期”和“文件”:
    • 当显式提交更改时,即。选择日期或文件
  • “文本”:
    • 当元素在其值已更改但未提交后失去焦点时

公平警告,浏览器是善变的,并不总是在事件上达成一致。然而,这确实是规范,您应该能够依靠这些时间。