158 votes

Comment simuler un clic de souris en utilisant JavaScript ?

Je suis au courant de la document.form.button.click() méthode. Cependant, j'aimerais savoir comment simuler la onclick événement.

J'ai trouvé ce code quelque part ici sur Stack Overflow, mais je ne sais pas comment l'utiliser :(

function contextMenuClick()
{
    var element= 'button'

    var evt = element.ownerDocument.createEvent('MouseEvents');

    evt.initMouseEvent('contextmenu', true, true,
         element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false,
         false, false, false, 1, null);

    element.dispatchEvent(evt);
}

Comment déclencher un événement de clic de souris en utilisant JavaScript ?

3 votes

Qu'essayez-vous d'atteindre en agissant ainsi ?

0 votes

@Nok Imchen - Pourriez-vous fournir un lien vers la question originale d'où vous avez tiré le code ?

0 votes

@Eric, c'est la même chose que le lien donné ci-dessous

231voto

TweeZz Points 2302

(Version modifiée pour que cela fonctionne sans prototype.js)

function simulate(element, eventName)
{
    var options = extend(defaultOptions, arguments[2] || {});
    var oEvent, eventType = null;

    for (var name in eventMatchers)
    {
        if (eventMatchers[name].test(eventName)) { eventType = name; break; }
    }

    if (!eventType)
        throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');

    if (document.createEvent)
    {
        oEvent = document.createEvent(eventType);
        if (eventType == 'HTMLEvents')
        {
            oEvent.initEvent(eventName, options.bubbles, options.cancelable);
        }
        else
        {
            oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView,
            options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
            options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element);
        }
        element.dispatchEvent(oEvent);
    }
    else
    {
        options.clientX = options.pointerX;
        options.clientY = options.pointerY;
        var evt = document.createEventObject();
        oEvent = extend(evt, options);
        element.fireEvent('on' + eventName, oEvent);
    }
    return element;
}

function extend(destination, source) {
    for (var property in source)
      destination[property] = source[property];
    return destination;
}

var eventMatchers = {
    'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
    'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/
}
var defaultOptions = {
    pointerX: 0,
    pointerY: 0,
    button: 0,
    ctrlKey: false,
    altKey: false,
    shiftKey: false,
    metaKey: false,
    bubbles: true,
    cancelable: true
}

Vous pouvez l'utiliser comme ceci :

simulate(document.getElementById("btn"), "click");

Notez qu'en tant que troisième paramètre, vous pouvez passer des "options". Les options que vous ne spécifiez pas sont prises dans les options par défaut (voir le bas du script). Donc si vous voulez par exemple spécifier les coordonnées de la souris, vous pouvez faire quelque chose comme :

simulate(document.getElementById("btn"), "click", { pointerX: 123, pointerY: 321 })

Vous pouvez utiliser une approche similaire pour remplacer d'autres options par défaut.

Les crédits doivent aller à kangax . Aquí C'est la source originale (spécifique au prototype.js).

7 votes

Les crédits doivent aller à kangax, comme indiqué dans ma réponse. Je l'ai rendu agnostique vis-à-vis des bibliothèques :)

0 votes

Comment passer les coordonnées de la souris à ce script ?

1 votes

Je vais modifier le message et ajouter un exemple de la façon dont vous pourriez passer dans les coordonnées de la souris

73voto

Derek 朕會功夫 Points 23487

Une méthode plus facile et plus standard manière de simuler un clic de souris serait d'utiliser directement le constructeur d'événements pour créer un événement et le distribuer.

Bien que le MouseEvent.initMouseEvent() est conservée pour des raisons de rétrocompatibilité, la création d'un objet MouseEvent doit être effectuée à l'aide de la méthode MouseEvent() constructeur.

var evt = new MouseEvent("click", {
    view: window,
    bubbles: true,
    cancelable: true,
    clientX: 20,
    /* whatever properties you want to give it */
});
targetElement.dispatchEvent(evt);

Démonstration : http://jsfiddle.net/DerekL/932wyok6/

Cela fonctionne sur tous les navigateurs modernes. Pour les anciens navigateurs, y compris IE, MouseEvent.initMouseEvent devra être utilisé malheureusement bien qu'il soit déprécié.

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", canBubble, cancelable, view,
                   detail, screenX, screenY, clientX, clientY,
                   ctrlKey, altKey, shiftKey, metaKey,
                   button, relatedTarget);
targetElement.dispatchEvent(evt);

58voto

Beejamin Points 4637

Voici une fonction JavaScript pure qui simulera un clic (ou tout autre événement de souris) sur un élément cible :

function simulatedClick(target, options) {

  var event = target.ownerDocument.createEvent('MouseEvents'),
      options = options || {},
      opts = { // These are the default values, set up for un-modified left clicks
        type: 'click',
        canBubble: true,
        cancelable: true,
        view: target.ownerDocument.defaultView,
        detail: 1,
        screenX: 0, //The coordinates within the entire page
        screenY: 0,
        clientX: 0, //The coordinates within the viewport
        clientY: 0,
        ctrlKey: false,
        altKey: false,
        shiftKey: false,
        metaKey: false, //I *think* 'meta' is 'Cmd/Apple' on Mac, and 'Windows key' on Win. Not sure, though!
        button: 0, //0 = left, 1 = middle, 2 = right
        relatedTarget: null,
      };

  //Merge the options with the defaults
  for (var key in options) {
    if (options.hasOwnProperty(key)) {
      opts[key] = options[key];
    }
  }

  //Pass in the options
  event.initMouseEvent(
      opts.type,
      opts.canBubble,
      opts.cancelable,
      opts.view,
      opts.detail,
      opts.screenX,
      opts.screenY,
      opts.clientX,
      opts.clientY,
      opts.ctrlKey,
      opts.altKey,
      opts.shiftKey,
      opts.metaKey,
      opts.button,
      opts.relatedTarget
  );

  //Fire the event
  target.dispatchEvent(event);
}

Voici un exemple concret : http://www.spookandpuff.com/examples/clickSimulation.html

Vous pouvez simuler un clic sur n'importe quel élément de l'arborescence. DOM . Quelque chose comme simulatedClick(document.getElementById('yourButtonId')) fonctionnerait.

Vous pouvez passer un objet dans options pour remplacer les valeurs par défaut (pour simuler le bouton de la souris que vous voulez, que ce soit le bouton de la souris ou le bouton de l'ordinateur). Shift / Alt / Ctrl sont tenues, etc. Les options qu'il accepte sont basées sur le API MouseEvents .

J'ai fait des tests avec Firefox, Safari et Chrome. Internet Explorer pourrait nécessiter un traitement spécial, je n'en suis pas sûr.

0 votes

Cela a bien fonctionné pour moi, sur Chrome, où les éléments ne semblent pas avoir l'événement click().

0 votes

C'est génial, sauf que type: options.click || 'click' devrait probablement être type: options.type || 'click' .

0 votes

Le problème de cette solution est qu'elle ne permet pas de cliquer sur les éléments contenus, par exemple. <div id = "outer"><div id = "inner"></div></div> simulatedClick(document.getElementById('outer')); ne cliquera pas sur l'élément intérieur.

13voto

Wizek Points 577

D'après la réponse de Derek, j'ai vérifié que

document.getElementById('testTarget')
  .dispatchEvent(new MouseEvent('click', {shiftKey: true}))

fonctionne comme prévu, même avec des modificateurs de clés. Et ce n'est pas une API dépréciée, pour autant que je puisse le voir. Vous pouvez vérifier sur cette page également .

12voto

Orion Points 1020

Extrait de la documentation du Mozilla Developer Network (MDN), HTMLElement.click() est ce que vous recherchez. Vous pouvez découvrir d'autres événements aquí .

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