Gab*_*vay 93 javascript jquery events dom
有人能告诉我change
和input
事件之间有什么区别吗?
我正在使用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)
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
触发元素内容的变化.所以你会看到这个事件更频繁地发生.浏览器支持各不相
这两个事件之间最显著的区别是什么原因引起的value
上的变化<input>
。
根据MDN:
又名,的
input
事件触发时value
的<input>
,<select>
或<textarea>
元件已被更改。
input
触发任何时间的value
变化。change
有点复杂:
换句话说,当用户提交对元素的更改时,
change
将针对<input>
、<select>
和<textarea>
元素触发该事件value
。与input
事件不同的change
是,不一定每次更改元素的value
.
change
当用户更改value
.当正是它激发依赖于type
的<input>
:
为了...
:checked
,通过键盘或鼠标单击公平警告,浏览器是善变的,并不总是在事件上达成一致。然而,这确实是规范,您应该能够依靠这些时间。