mas*_*ore 4 html javascript c# google-chrome google-chrome-devtools
我试图从https://adwords.google.com/ko/KeywordPlanner/Home使用CefSharp(版本43)中删除关键字
我能够以编程方式登录adwords门户.
但是,每当我试图插入一些文本(搜索关键词)到特定的文本区域(id="gwt-debug-keywords-text-area"通过分配)element.value,element.innerText并element.innerHtml以所需的字符串,但没有任何反应.
var txtElem = document.getElementById("gwt-debug-keywords-text-area");
txtElem.addEventListener("keydown", onKeyPress, false);
function onKeyPress(e) {
alert(e.keyCode);
}
function triggerKeyboardEvent(el, keyCode) {
var evt = document.createEventObject ?
document.createEventObject() : document.createEvent("Events");
if (evt.initEvent) {
evt.initEvent("keydown", true, true);
}
evt.keyCode = keyCode;
evt.which = keyCode;
el.dispatchEvent ? el.dispatchEvent(evt) : el.fireEvent("onkeydown", evt);
}
triggerKeyboardEvent(txtElem, "s".charCodeAt(0));
Run Code Online (Sandbox Code Playgroud)
在上面的代码中引发了警报消息,但文本框仍然是空的.
显然,该文本区域的关键/下行事件正在被谷歌自己的大量JS代码拦截.不幸的是谷歌源代码是高度混淆的,像我这样的JS-noob很难调试和遵循逻辑.
如何在textarea中插入/模拟键盘输入?
我尝试过的其他一些代码(也参见注释掉的部分):
var txtElem = document.getElementById("gwt-debug-keywords-text-area");
txtElem.focus();
function simulateKeyEvent(character) {
var e = new KeyboardEvent("keydown", { bubbles: true, cancelable: true, key: character.charCodeAt(0), char: character, shiftKey: false });
//var e = new KeyboardEvent("keydown", { bubbles: true, cancelable: true, key: "a".charCodeAt(0), char: "a", shiftKey: true });
return !document.getElementById("gwt-debug-keywords-text-area").dispatchEvent(e);
var evt = document.createEvent("KeyboardEvent");
/*
if (e.initKeyboardEvent) { // Chrome, IE
e.initKeyboardEvent("keydown", true, true, document.defaultView, "Enter", 0, "", false, "");
} else { // FF
e.initKeyEvent("keydown", true, true, document.defaultView, false, false, false, false, character.charCodeAt(0), 0);
}
*/
//(evt.initKeyEvent || evt.initKeyboardEvent)('keypress', true, true, document.defaultView, 0, 0, 0, 0, 0, character.charCodeAt(0));
evt.initKeyboardEvent("keypress", true, true, document.defaultView, 0, 0, 0, 0, 0, character.charCodeAt(0));
return !document.getElementById("gwt-debug-keywords-text-area").dispatchEvent(evt);
}
simulateKeyEvent("s");
Run Code Online (Sandbox Code Playgroud)
这些方法都不起作用....
感谢@kentcdodds。
您需要改用 Textarea 的 valueSetter。
const textarea = document.getElementsByTagName('textarea')[0]
function setNativeValue(element, value) {
const { set: valueSetter } = Object.getOwnPropertyDescriptor(element, 'value') || {}
const prototype = Object.getPrototypeOf(element)
const { set: prototypeValueSetter } = Object.getOwnPropertyDescriptor(prototype, 'value') || {}
if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
prototypeValueSetter.call(element, value)
} else if (valueSetter) {
valueSetter.call(element, value)
} else {
throw new Error('The given element does not have a value setter')
}
}
setNativeValue(textarea, 'some text')
textarea.dispatchEvent(new Event('input', { bubbles: true }))
Run Code Online (Sandbox Code Playgroud)
该setNativeValue函数设置 DOM 元素的值,例如文本区域。它通过使用元素或其原型的“值”属性设置器来实现此目的。如果没有找到 setter,则会抛出错误。
好的,我找到了解决方案:
function setKeywordText(text) {
var el = document.getElementById("gwt-debug-keywords-text-area");
el.value = text;
var evt = document.createEvent("Events");
evt.initEvent("change", true, true);
el.dispatchEvent(evt);
}
setKeywordText("test");
Run Code Online (Sandbox Code Playgroud)
@masroore的代码工作得很好,今天救了我.但后来我发现这个方法已被弃用,正在被删除.
用新方法更新了代码,它执行相同的操作:
function setKeywordText(text)
{
var el = document.getElementById("gwt-debug-keywords-text-area");
el.value = text;
var evt= new Event('change');
el.dispatchEvent(evt);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3457 次 |
| 最近记录: |