Come simulare un clic utilizzando le coordinate x, y in JavaScript?


Risposte:


145

Puoi inviare un evento clic , anche se questo non è la stessa cosa di un clic reale. Ad esempio, non può essere utilizzato per ingannare un documento iframe interdominio facendogli credere che è stato cliccato.

Tutti i browser moderni supportano document.elementFromPointe HTMLElement.prototype.click(), a partire da almeno IE 6, Firefox 5, qualsiasi versione di Chrome e probabilmente qualsiasi versione di Safari a cui potresti interessarti. Seguirà anche collegamenti e invierà moduli:

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

https://developer.mozilla.org/En/DOM:document.elementFromPoint https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click


1
@RadiantHex: sì, infatti IE è stato il primo a implementarlo e risale a IE6. Le implementazioni di Chrome, Firefox e Safari 5 vanno bene, ma quelle di Safari 4 e Opera non sono corrette (sebbene funzionanti). Vedi quirksmode.org/dom/w3c_cssom.html#documentview .
Andy E

1
Sono così felice di questa scoperta !! = D Rende possibili molte cose ritenute impossibili ora =) ... o almeno meno complicate. Grazie!!
RadiantHex

1
Questo non sembra funzionare con gli eventi $ .live (), qualcuno sa come farlo funzionare anche con eventi creati con $ .live ()?
ActionOwl

1
@AndyE Ora funziona nelle seguenti condizioni: Ho una pagina web, sto caricando Iframe da un dominio diverso dal mio. E voglio fare clic nell'area iframe. Hai qualche soluzione in merito?
Parixit

2
@parixit: no, non è possibile. Puoi simulare un clic sull'iframe ma si limiterà a propagare il documento contenente. Nulla nel documento contenuto sarà influenzato (per ovvie ragioni di sicurezza).
Andy E

67

Sì, puoi simulare un clic del mouse creando un evento e inviandolo:

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);
}

Attenzione all'uso del clickmetodo su un elemento: è ampiamente implementato ma non standard e non funzionerà, ad esempio, in PhantomJS. Presumo che l'implementazione di jQuery .click()faccia la cosa giusta ma non l'ho confermata.


Mi ha salvato da un casino. Il mio metodo iniziale non è riuscito, ma questo è venuto in soccorso, grazie.
iChux

3
plus1 per non usare jQuery. In contrasto con la risposta accettata, questo non rispondere alla domanda.
tomekwi

1
Questo è molto, molto più potente di jQuery$.click()
Steven Lu


3
Invece del deprecato initMouseEventpuoi usare var event = new MouseEvent( "click", { clientX: x, clientY: y, bubbles: true } )Questo è anche mostrato in stackoverflow.com/a/36144688/384670 .
M Katz

28

Questa è solo la risposta di torazaburo , aggiornata per utilizzare un oggetto 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);
}

0

non funziona per me ma stampa l'elemento corretto sulla console

questo è il codice:

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);

-2

Per motivi di sicurezza, non puoi muovere il puntatore del mouse con javascript, né simulare un clic con esso.

Cosa stai cercando di ottenere?


@Aicule: grazie per avermelo fatto sapere! Aggiungerò un po 'di informazioni alla domanda. Sto solo sperimentando, niente di veramente produttivo =)
RadiantHex

2
In Chrome e Safari, puoi fare clic su una specifica posizione x, y. Ecco come funziona questa demo . Firefox è l'unico browser in cui fallisce, quindi forse è una politica di sicurezza specifica di Firefox.
thdoan

La verità sta nella risposta qui sotto, createEvent()+initMouseEvent()
Valer

1
Nel mio caso, test.
Jose Nobile

Puoi sicuramente simulare un clic con coordinate X / Y specifiche, anche se non si comporterà esattamente allo stesso modo.
Agamemnus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.