Jak symulować kliknięcie za pomocą współrzędnych x, y w JavaScript?


Odpowiedzi:


151

Możesz wywołać zdarzenie kliknięcia , ale nie jest to to samo, co prawdziwe kliknięcie. Na przykład nie można go używać do oszukiwania międzydomenowego dokumentu iframe, aby pomyślał, że został kliknięty.

Wszystkie nowoczesne przeglądarki obsługują document.elementFromPointi HTMLElement.prototype.click(), od co najmniej IE 6, Firefox 5, każdą wersję Chrome i prawdopodobnie każdą wersję Safari, na której prawdopodobnie Ci zależy. Będzie nawet podążać za linkami i przesyłać formularze:

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: tak, w rzeczywistości IE był pierwszym, który go zaimplementował i wraca do IE6. Implementacje Chrome, Firefox i Safari 5 są w porządku, ale Safari 4 i Opera są niepoprawne (choć działają). Zobacz quirksmode.org/dom/w3c_cssom.html#documentview .
Andy E

1
Bardzo się cieszę z tego odkrycia !! = D Sprawia, że ​​wiele rzeczy uznanych za niemożliwe teraz jest możliwe =) ... lub przynajmniej mniej skomplikowane. Dzięki!!
RadiantHex,

1
Wygląda na to, że nie działa to ze zdarzeniami $ .live (), czy ktoś jak sprawić, by działało również ze zdarzeniami utworzonymi za pomocą $ .live ()?
ActionOwl

1
@AndyE Teraz działa w następującym stanie: Mam stronę internetową, ładuję ramkę iframe z domeny innej niż moja. I chcę kliknąć obszar iframe. Czy masz jakieś rozwiązanie w tej sprawie?
Parixit

2
@parixit: nie, to niemożliwe. Możesz zasymulować kliknięcie elementu iframe, ale spowoduje to po prostu propagację zawierającego dokument. Nic w zawartym dokumencie nie zostanie naruszone (z oczywistych względów bezpieczeństwa).
Andy E,

67

Tak, możesz symulować kliknięcie myszą, tworząc zdarzenie i wysyłając je:

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

Uważaj na użycie clickmetody na elemencie - jest ona szeroko zaimplementowana, ale nie standardowa i zawiedzie np. W PhantomJS. Zakładam, że implementacja jQuery .click()robi dobrze, ale nie potwierdziła.


Uratował mnie od bałaganu. Moja początkowa metoda zawiodła, ale ta przyszła z pomocą, dzięki.
iChux

3
plus1 za nieużywanie jQuery. W sprzeczne z przyjętymi odpowiedź, ten ma odpowiedzieć na pytanie.
tomekwi

1
To jest dużo, dużo potężniejsze niż jQuery$.click()
Steven Lu


3
Zamiast wycofanego initMouseEvent, możesz użyć. var event = new MouseEvent( "click", { clientX: x, clientY: y, bubbles: true } )Jest to również pokazane na stackoverflow.com/a/36144688/384670 .
M Katz

28

To jest tylko odpowiedź torazaburo , zaktualizowana do używania obiektu 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

jak dla mnie działa, ale wypisuje poprawny element na konsoli

to jest kod:

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

Ze względów bezpieczeństwa nie można przesuwać wskaźnika myszy za pomocą javascript ani symulować za jego pomocą kliknięcia.

Co próbujesz osiągnąć?


@Aicule: dzięki za poinformowanie mnie! Dodam trochę informacji do pytania. Po prostu eksperymentuję, nic naprawdę produktywnego =)
RadiantHex

2
W Chrome i Safari możesz uruchomić kliknięcie w określonej pozycji x, y. Tak działa to demo . Firefox jest jedyną przeglądarką, w której się nie udaje, więc może jest to polityka bezpieczeństwa specyficzna dla Firefoksa.
thdoan

Prawda tkwi w odpowiedzi poniżej, createEvent()+initMouseEvent()
Valer,

1
W moim przypadku testowanie.
Jose Nobile

Zdecydowanie możesz symulować kliknięcie za pomocą określonych współrzędnych X / Y, chociaż nie będzie ono zachowywać się dokładnie w ten sam sposób.
Agamemnus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.