async function inputText(input, text) {
// 手动触发 input 和 change 事件
for (let event of ['click', 'focus', 'text', 'input', 'change', 'blur']){
if (event === 'text'){
input.value = text;
}else{
input.dispatchEvent(new Event(event, { bubbles: true }));
}
await sleep(600)
}
}
方式1
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function simulateTextInput(inputBox, text) {
let range = document.createRange();
range.selectNodeContents(inputBox);
let sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
await sleep(500)
let inputEvent = new InputEvent('input', {
bubbles: true,
cancelable: true,
inputType: 'insertText',
data: text
});
inputBox.textContent = text;
inputBox.dispatchEvent(inputEvent);
}
box = document.querySelector('#main .copyable-area [contenteditable="true"][role="textbox"]')
simulateTextInput(box, "😇")
方式2
let text = document.querySelector('div textarea')
let pasteEvent = new ClipboardEvent('paste', {
dataType: 'text/plain',
data: imgs.join('\n')
});
let event = new Event('input', {
bubbles: true,
cancelable: true,
});
// 模拟设置粘贴的内容
text.value = 'something';
// 触发粘贴事件
text.dispatchEvent(event);
方式3
const e = new InputEvent("input", {
bubbles: true,
cancelable: true
});
ele.dispatchEvent(e);
const ee = new KeyboardEvent("keydown", {
altKey: false,
bubbles: true,
cancelable: true,
key: 'Enter',
code: 'Enter',
keyCode: 13,
repeat: false
});
ele.dispatchEvent(ee);
终极
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fillData(input, value) {
let events = ['click', 'focus', 'setVal', 'input', 'change', 'blur'];
for (let event of events) {
if (event === 'setVal') {
if (input.tagName.toLowerCase() === 'input') {
input.setAttribute('value', value)
} else {
//text
input.textContent = value
}
} else {
console.log(`fill value query: ${input} value: ${value} event: ${event}`,);
let eventObj = new Event(event, {
bubbles: true,
cancelable: true,
})
input.dispatchEvent(eventObj);
await sleep(400)
}
}
}