Quel est le meilleur moyen de simuler un utilisateur saisissant du texte dans une zone de saisie de texte dans JS et/ou jQuery?
Je ne pas veux réellement mettre du texte dans la zone de saisie, je veux juste déclencher tous les événements gestionnaires qui seraient normalement déclenchés par un utilisateur tapant des informations dans une entrée boîte. Cela signifie que la mise au point, la pression au clavier, l'appui sur la touche, la configuration au clavier et le flou. Je pense.
Alors, comment accomplir cela?
Vous pouvez déclencher n'importe lequel des événements avec un appel direct, comme ceci:
$(function() {
$('item').keydown();
$('item').keypress();
$('item').keyup();
$('item').blur();
});
Cela fait-il ce que vous essayez de faire?
Vous devriez probablement aussi déclencher .focus()
et potentiellement .change()
Si vous souhaitez déclencher les événements-clés avec des clés spécifiques, procédez comme suit:
$(function() {
var e = $.Event('keypress');
e.which = 65; // Character 'A'
$('item').trigger(e);
});
Il existe une discussion intéressante sur les événements de pression de touche ici: jQuery Event Keypress: quelle touche a été enfoncée? , en particulier en ce qui concerne la compatibilité entre navigateurs avec la propriété .which.
Pour déclencher une enter appuyez sur la touche, j'ai dû modifier la réponse @ebynum, plus précisément à l'aide de la propriété keyCode.
e = $.Event('keyup');
e.keyCode= 13; // enter
$('input').trigger(e);
Vous pouvez envoyer des événements comme
el.dispatchEvent(new Event('focus'));
el.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));
Voici un exemple de Vanilla js pour déclencher n'importe quel événement:
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);
}
}
Vous êtes maintenant capable de faire:
var e = $.Event("keydown", {keyCode: 64});
Vous pouvez y parvenir avec: EventTarget.dispatchEvent(event)
et en transmettant un nouvel événement KeyboardEvent en tant qu'événement.
Par exemple: element.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}))
Exemple de travail:
// get the element in question
const input = document.getElementsByTagName("input")[0];
// focus on the input element
input.focus();
// add event listeners to the input element
input.addEventListener('keypress', (event) => {
console.log("You have pressed key: ", event.key);
});
input.addEventListener('keydown', (event) => {
console.log(`key: ${event.key} has been pressed down`);
});
input.addEventListener('keyup', (event) => {
console.log(`key: ${event.key} has been released`);
});
// dispatch keyboard events
input.dispatchEvent(new KeyboardEvent('keypress', {'key':'h'}));
input.dispatchEvent(new KeyboardEvent('keydown', {'key':'e'}));
input.dispatchEvent(new KeyboardEvent('keyup', {'key':'y'}));
<input type="text" placeholder="foo" />
Tout d'abord, je dois dire que l'échantillon de Sionnach733 a parfaitement fonctionné. Certains utilisateurs se plaignent de l'absence d'exemples réels. Voici mes deux cents. J'ai travaillé sur la simulation de clic de souris en utilisant ce site: https://www.youtube.com/tv . Vous pouvez ouvrir n'importe quelle vidéo et essayer d'exécuter ce code. Il effectue le passage à la vidéo suivante.
function triggerEvent(el, type, keyCode) {
if ('createEvent' in document) {
// modern browsers, IE9+
var e = document.createEvent('HTMLEvents');
e.keyCode = keyCode;
e.initEvent(type, false, true);
el.dispatchEvent(e);
} else {
// IE 8
var e = document.createEventObject();
e.keyCode = keyCode;
e.eventType = type;
el.fireEvent('on'+e.eventType, e);
}
}
var nextButton = document.getElementsByClassName('icon-player-next')[0];
triggerEvent(nextButton, 'keyup', 13); // simulate mouse/enter key press
Je pensais attirer votre attention sur le fait que dans le contexte spécifique où un auditeur était défini dans un plugin jQuery, la seule chose qui a simulé avec succès l'événement de frappe pour moi, finalement capturé par cet écouteur, était d'utiliser setTimeout (). par exemple.
setTimeout(function() { $("#txtName").keypress() } , 1000);
Toute utilisation de $("#txtName").keypress()
était ignoré, bien qu'elle soit placée à la fin de .ready() function
. De toute façon, aucun supplément DOM particulier n'a été créé de manière asynchrone.
Pour la conversion TypeScript en KeyboardEventInit et fournissez le nombre entier correct KeyCode
const event = new KeyboardEvent("keydown", {
keyCode: 38,
} as KeyboardEventInit);