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

96

Czy możliwe jest użycie podanych współrzędnych do symulacji kliknięcia w JavaScript na stronie internetowej?

RadiantHex
źródło
2
Jaki jest Twój cel? :) Czy próbujesz zasymulować kliknięcie na przykład na mapie obrazu?
Nick Craver

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

Andy E.
źródło
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.

Victor Zamanian
źródło
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
7
initMouseEventzostał wycofany: developer.mozilla.org/en-US/docs/Web/API/MouseEvent/…
vikeri
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);
}
user2067021
źródło
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);
VilgotanL
źródło
-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ąć?

quantumSoup
źródło
@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