如果用户在插入文本后没有触摸输入,'input' 事件永远不会触发,value 属性也不会反映变化。因此,在以编程方式插入文本后触发输入事件很重要。专注于该领域是不够的。
以下是Snorvarg's answer 的副本,末尾带有输入触发器:
function insertAtCursor(myField, myValue) {
//IE support
if (document.selection) {
myField.focus();
sel = document.selection.createRange();
sel.text = myValue;
}
// Microsoft Edge
else if(window.navigator.userAgent.indexOf("Edge") > -1) {
var startPos = myField.selectionStart;
var endPos = myField.selectionEnd;
myField.value = myField.value.substring(0, startPos)+ myValue
+ myField.value.substring(endPos, myField.value.length);
var pos = startPos + myValue.length;
myField.focus();
myField.setSelectionRange(pos, pos);
}
//MOZILLA and others
else if (myField.selectionStart || myField.selectionStart == '0') {
var startPos = myField.selectionStart;
var endPos = myField.selectionEnd;
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
} else {
myField.value += myValue;
}
triggerEvent(myField,'input');
}
function triggerEvent(el, type){
if ('createEvent' in document) {
// modern browsers, IE9+
var e = document.createEvent('HTMLEvents');
e.initEvent(type, false, true);
el.dispatchEvent(e);
} else {
// IE 8
var e = document.createEventObject();
e.eventType = type;
el.fireEvent('on'+e.eventType, e);
}
}
triggerEvent 函数归功于plainjs.com
w3schools.com 上有关 oninput 事件的更多信息
我在为聊天创建表情符号选择器时发现了这一点。如果用户只是选择几个表情符号并点击“发送”按钮,则用户永远不会触摸输入字段。检查 value 属性时,它始终为空,即使插入的表情符号 unicode 在输入字段中可见。事实证明,如果用户不触摸该字段,则“输入”事件永远不会触发,解决方案是像这样触发它。花了很长时间才弄清楚这个……希望它能节省一些时间。