2 votes

Sur Gmail, pourquoi le champ "À" ne peut-il pas être cliqué avec javascript?

Je construis un outil d'accessibilité qui aide les personnes à mobilité réduite à écrire des e-mails, donc j'ai besoin du focus programmatique sur le champ "À" (le premier champ dans la fenêtre de composition de Gmail).

J'ai essayé diverses combinaisons des actions suivantes dans le panneau Chrome DevTools, sur l'élément textarea et son parent. Rien ne semble le mettre au premier plan.

setTimeout(() => {
    let el = document.querySelector('*[name="to"]');
    el.dispatchEvent(new MouseEvent('mouseover', {bubbles: true}));
    el.dispatchEvent(new MouseEvent('mousedown', {bubbles: true}));
    el.focus();
    el.dispatchEvent(new MouseEvent('mouseup', {bubbles: true}));
    el.click();
    console.log('done')
}, 5000)

Voici un exemple du balisage pertinent :

            CcCc Cci

1 votes

Un de ses parents a display: none

0 votes

@CertainPerformance non, si vous regardez dans les outils de développement dans le champ CSS calculé, vous pouvez voir que c'est display: block, et que ses parents ne sont pas cachés.

3voto

Ilmari Karonen Points 20585

Lorsque vous n'êtes pas concentré, les champs "À", "Cc" et "CCI" de la fenêtre de composition de Gmail sont recouverts par un autre champ intitulé "Destinataires" :

Capture d'écran

Ce champ "Destinataires" a un gestionnaire d'événements de focus qui le masque automatiquement, affiche les champs "À", "Cc" et "CCI" et transfère le focus vers l'un d'eux. Pour activer le gestionnaire programmé, vous devez d'abord localiser le champ "Destinataires" et envoyer un événement de focus. Le code suivant a fonctionné pour moi dans la console de Chrome, bien que je suspecte que l'ID que j'ai utilisé ne soit peut-être pas stable :

let recipients = document.getElementById(':oa');  // pas sûr si cet ID change
recipients.dispatchEvent(new FocusEvent('focus'));

(Une fois qu'au moins une adresse e-mail a été saisie dans les champs "À" / "Cc" / "CCI", l'apparence du champ "Destinataires" change, masquant le libellé et affichant à la place les adresses des destinataires. Cependant, le même code semble toujours fonctionner pour activer le gestionnaire d'événements de focus.)


Ps. L'ID du nœud avec le gestionnaire de focus semble en effet changer. Je ne sais pas comment le localiser de manière fiable — le code HTML n'offre vraiment pas grand-chose pour accrocher un sélecteur fiable :

  Destinataires

Vous pourriez devoir recourir à des manipulations XPath pour le localiser en utilisant le texte de libellé, comme ceci :

let recipients = document.evaluate("//div[text()='Destinataires']/..", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

Mais même cela ne fonctionnera que lorsque aucun destinataire n'aura été saisi (quand il y en a, le libellé "Destinataires" est remplacé par la liste des destinataires), et il est également susceptible de ne pas fonctionner si la langue de l'interface de l'utilisateur n'est pas en anglais. :(

0 votes

Très impressionné. Auriez-vous l'obligeance de me faire savoir comment vous avez découvert que l'élément avec "Destinataires" à l'intérieur volait et transférait le focus? Ma meilleure supposition est que vous avez vu "Destinataires" au bon endroit sur la page, que vous avez cherché dans le DOM, puis vous avez utilisé le panneau "Écouteurs d'événements" pour regarder le JS pertinent? Mais le JS est compressé et très difficile à lire. Est-ce que j'ai manqué quelque chose ici? Je serais vraiment reconnaissant d'apprendre "à pêcher" pour ainsi dire. Merci d'avance!

0 votes

Oui. J'ai utilisé l'élément Inspecter dans le menu contextuel du clic droit pour trouver l'élément du DOM correspondant au champ "Destinataires" et ensuite, avec cet élément sélectionné, j'ai utilisé l'onglet "Écouteurs d'événements" dans les outils de développement pour chercher un gestionnaire d'événements s'appliquant uniquement à cet élément spécifique. Ça m'a pris une minute à trouver parce que je cherchais d'abord des gestionnaires d'événements de clic ou de mousedown, mais finalement j'ai pensé à regarder sous "focus" à la place.

1 votes

Et oui, le code affiché pour le gestionnaire d'événements est assez insignifiant (function(e){return c.call(d.src,d.listener,e)}), mais simplement le fait de voir que le gestionnaire était là a suffi à me donner un indice pour essayer d'envoyer un événement de focus à l'élément pour voir ce qui se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X