112 votes

Comment simuler un clic en utilisant les coordonnées x,y en JavaScript ?

Est-il possible d'utiliser des coordonnées données afin de simuler un clic en JavaScript dans une page web ?

2 votes

Quel est votre objectif ?) Essayez-vous de simuler un clic sur une carte d'image par exemple ?

176voto

Andy E Points 132925

Vous pouvez envoyer une cliquez sur mais ce n'est pas la même chose qu'un clic réel. Par exemple, il ne peut pas être utilisé pour faire croire à un document iframe inter-domaines qu'il a été cliqué.

Tous les navigateurs modernes prennent en charge document.elementFromPoint y HTMLElement.prototype.click() Depuis au moins IE 6, Firefox 5, toutes les versions de Chrome et probablement toutes les versions de Safari dont vous êtes susceptible de vous soucier. Il peut même suivre des liens et soumettre des formulaires :

document.elementFromPoint(x, y).click();

1 votes

@RadiantHex : oui, en fait IE a été le premier à l'implémenter et cela remonte à IE6. Les implémentations de Chrome, Firefox et Safari 5 sont correctes, mais celles de Safari 4 et d'Opera sont incorrectes (bien que réalisables). Voir quirksmode.org/dom/w3c_cssom.html#documentview .

1 votes

Je suis si heureux de cette découverte ! !! =D Rend possible beaucoup de choses jugées impossibles maintenant =) ... ou du moins moins moins compliquées. Merci !

1 votes

Cela ne semble pas fonctionner avec les événements $.live(). Quelqu'un sait-il comment le faire fonctionner avec les événements créés avec $.live() également ?

79voto

torazaburo Points 6335

Oui, vous pouvez simuler un clic de souris en créant un événement et en le répartissant :

function click(x,y){
    var ev = document.createEvent("MouseEvent");
    var el = document.elementFromPoint(x,y);
    ev.initMouseEvent(
        "click",
        true /* bubble */, true /* cancelable */,
        window, null,
        x, y, 0, 0, /* coordinates */
        false, false, false, false, /* modifier keys */
        0 /*left*/, null
    );
    el.dispatchEvent(ev);
}

Attention à l'utilisation du click sur un élément -- elle est largement implémentée mais pas standard et échouera dans PhantomJS par exemple. Je suppose que l'implémentation de jQuery de la méthode .click() fait la bonne chose mais n'ont pas confirmé.

0 votes

Il m'a sauvé d'un désastre. Ma méthode initiale a échoué mais celle-ci est venue à la rescousse, merci.

3 votes

Plus 1 pour ne pas utiliser jQuery. Contrairement à la réponse acceptée, celle-ci hace répondre à la question.

1 votes

C'est beaucoup, beaucoup plus puissant que la fonction de jQuery $.click()

39voto

user2067021 Points 735

C'est juste La réponse de torazaburo mis à jour pour utiliser un objet MouseEvent.

function click(x, y)
{
    var ev = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true,
        'screenX': x,
        'screenY': y
    });

    var el = document.elementFromPoint(x, y);

    el.dispatchEvent(ev);
}

2voto

VilgotanL Points 139

Cela ne fonctionne pas pour moi mais il imprime l'élément correct dans la console.

voici le code :

function click(x, y)
{
    var ev = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true,
        'screenX': x,
        'screenY': y
    });

    var el = document.elementFromPoint(x, y);
    console.log(el); //print element to console
    el.dispatchEvent(ev);
}
click(400, 400);

-4voto

quantumSoup Points 6565

Pour des raisons de sécurité, vous ne pouvez pas déplacer le pointeur de la souris avec le javascript, ni simuler un clic avec celui-ci.

Qu'est-ce que vous essayez d'accomplir ?

0 votes

@Aicule : merci de me le faire savoir ! Je vais ajouter un peu d'info à la question. Je ne fais qu'expérimenter, rien de vraiment productif =)

2 votes

Dans Chrome et Safari, vous pouvez déclencher un clic à une position x,y spécifique. Voici comment cette démo fonctionne. Firefox est le seul navigateur où cela échoue, il s'agit donc peut-être d'une politique de sécurité spécifique à Firefox.

0 votes

La vérité se trouve dans la réponse ci-dessous, createEvent() + initMouseEvent()

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