Przesunąć wskaźnik myszy w określone miejsce?

132

Tworzę grę HTML5 i próbuję ustawić kursor myszy na określonej kontrolce na określonym wydarzeniu, aby poruszanie się w określonym kierunku zawsze dawało ten sam rezultat. czy to możliwe?

Dennkster
źródło
Jeśli dobrze rozumiem, chcesz przesunąć kursor myszy za pomocą JS - to nie jest możliwe. Musisz znaleźć inny sposób.
trzydzieści kropek
1
HTML5 ma kilka nowych zdarzeń myszy, ale nic nie porusza myszą. Zawsze możesz window.moveBy (x, y); przesunąć okno pod miejsce, w którym unosi się mysz ... to byłaby całkiem fajna gra :) Jedyny inny sposób, w jaki widzę to robione, to użycie ActiveX - ewwww, yuk!
Jeremy Thompson,
1
Nie - JavaScript nie pozwoli ci tego zrobić, ale wydaje mi się, że może istnieć obejście polegające na przeniesieniu strony do określonej lokalizacji, które spowodowałoby również „przesunięcie” kursora za pomocą okna scrollTo () - zobacz w3Schools na w3schools.com/jsref/met_win_scrollto.asp .
Stardust,
1
Powodzenia w poruszaniu myszą na smartfonach.
Cœur
Obraz wskaźnika myszy można przesuwać i ustawiać kursor: brak. To nie jest zagrożenie bezpieczeństwa, ponieważ jesteś programistą. Jeśli potrafisz stworzyć grę, możesz również uniknąć ryzyka kliknięcia na swoje konto bankowe podczas gry.

Odpowiedzi:

21

Więc wiem, że to stary temat, ale najpierw powiem, że nie jest to możliwe. Obecnie najbliższą rzeczą jest zablokowanie myszy w jednej pozycji i śledzenie zmian w jej X i Y. Ta koncepcja została przyjęta przez - wygląda na to - Chrome i Firefox. Jest zarządzany przez tak zwaną blokadę myszy , a uderzenie w ucieczkę ją złamie. Z moich krótkich informacji wynika, że ​​pomysł polega na tym, że blokuje on mysz w jednym miejscu i raportuje zdarzenia ruchu podobne do zdarzeń typu „kliknij i przeciągnij”.

Oto dokumentacja wydania:
FireFox: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Chrome: http://www.chromium.org/developers/design-documents/mouse-lock

A oto całkiem zgrabna demonstracja: http://media.tojicode.com/q3bsp/

Codesmith
źródło
Przyjmuję to jako nową zaakceptowaną odpowiedź, ponieważ jest to dokładnie ten przypadek użycia, o który prosiłem, mimo że nie jest obsługiwany we wszystkich przeglądarkach.
Dennkster
194

Nie możesz przesuwać wskaźnika myszy za pomocą JavaScript.

Pomyśl przez chwilę o konsekwencjach, jeśli możesz;)

  1. Użytkownik myśli: „hej, chciałbym kliknąć ten link”
  2. Javascript przenosi kursor myszy do innego łącza
  3. Użytkownik klika niewłaściwy link i nieumyślnie pobiera złośliwe oprogramowanie, które formatuje jego dysk C i zjada jego cukierki
Martin Jespersen
źródło
75
PRAWDZIWE Clickjacking.
Blender
16
Jeśli się nad tym zastanowić, byłoby wspaniale: P
Martin Jespersen
24
Heh, nienawidziłbym walki o kontrolę nad kursorem myszy: WSTECZ REKLAMY, POWRÓT POWTÓRZ!
Blender
81
Strona internetowa może wymusić pobranie bez konieczności klikania łącza, więc to, co twierdzisz, nie jest tak naprawdę kwestią bezpieczeństwa. Brak możliwości wyjścia poza okno strony internetowej jest jednak.
dionyziz
11
@dionyziz: Istnieje dość duża różnica między wymuszonym pobieraniem do piaskownicy a pobieraniem w przestrzeni użytkownika rozpoczynanym przez interakcję użytkownika. Implikacje dla bezpieczeństwa są w rzeczywistości bardzo duże.
Martin Jespersen
90
  1. Uruchom mały serwer WWW na komputerze klienckim. Może to być mała rzecz o wielkości 100 KB. Skrypt Python / Perl itp.
  2. Dołącz mały, wstępnie skompilowany plik wykonywalny C, który może poruszać myszą.
  3. Uruchom go jako skrypt CGI za pomocą prostego wywołania http, AJAX, cokolwiek - ze współrzędnymi, na które chcesz przesunąć mysz, np .:

    http://localhost:9876/cgi/mousemover?x=200&y=450

PS: W przypadku każdego problemu istnieją setki wymówek, dlaczego i jak - nie można i nie powinno się - zrobić. Ale w tym nieskończonym wszechświecie to tak naprawdę tylko kwestia determinacji - czy TY sprawi, że to się stanie.

Alex Gray
źródło
13
Myślę, że wszyscy byliśmy na pokładzie aż do
wydania
1
serwer WWW? być może masz na myśli program z interfejsem http… nie ma potrzeby korzystania z sieci. Język programowania Go może być korzystniejszy w stosunku do C, ponieważ może ułatwić dodanie części http, lub alternatywnie interpreter nodejs uruchomiłby kod, który mógłby również zawierać interfejs http, dość łatwo, ponieważ interpreter nodejs jest zbudowany tak, aby ułatwić pisać aplikacje serwerowe.
barlop
3
C = 0 zależności. Sieć to http. Żadnej uroczej strony domowej. Tylko transport.
Alex Grey
+1 dla PS. Czy możemy wykonywać wywołania CGI przy użyciu węzła dev-server lub czegoś podobnego npmjs.com/package/http-server ?
ATHER
1
Czy ktoś z Was zauważył Javascripttag pod pytaniem?
82

Wyobrażam sobie, że możesz umieścić kursor myszy w danym obszarze ekranu, jeśli nie użyjesz prawdziwego (systemowego) kursora myszy.

Na przykład, możesz stworzyć obraz, który będzie działał w miejscu kursora, obsłużyć zdarzenie, które po wykryciu wejścia myszy w scenę, ustawić styl kursora systemowego na „none” ( sceneElement.style.cursor = 'none'), a następnie wywołać ukryty element obrazu działający jako kursor, który ma być w dowolnym miejscu sceny w oparciu o predefiniowane tłumaczenie osi / obwiedni.

W ten sposób bez względu na to, jak przesunąłeś rzeczywisty kursor, Twoja metoda tłumaczenia utrzymywałaby kursor obrazu tam, gdzie jej potrzebujesz.

edit: przykład w jsFiddle wykorzystujący reprezentację obrazu i wymuszony ruch myszy

Xaxis
źródło
5
Tak, możesz. Po prostu ustawiasz styl kursora na danym elemencie na „none”. Spróbuj.
Xaxis
14
To najbardziej przemyślana odpowiedź. I rzeczywiście stanowi realne rozwiązanie, podczas gdy niektóre inne odpowiedzi dot naprawdę żadnej wartości :) Ale jak WebGL przynieść ciekawe gry, takie jak FPS etc kiedy nie możemy uzyskać wszelkie blokady myszy, że brzmi całkiem ograniczających ...
Dennkster
3
Wciąż występuje problem polegający na tym, że nie można „kontynuować ruchu” myszy w lewo. Gdy mysz opuści stronę internetową, nie możesz jej dalej kontrolować.
dionyziz
2
To idealne rozwiązanie tego problemu. Jedynym powodem, dla którego ludzie narzekają, jest to, że nie jest to trywialne rozwiązanie. Czasami trzeba trochę programować, chłopaki!
Marty
5
bawiłem się tym pomysłem i zrobiłem przykład w JSFiddle jsfiddle.net/jaakkytt/9uczV
Jaak Kütt
65

Świetne pytanie. Tego naprawdę brakuje w interfejsie API przeglądarki Javascript. Pracuję też z moim zespołem nad grą WebGL i potrzebujemy tej funkcji. Otworzyłem problem w bugzilli Firefoksa, abyśmy mogli zacząć mówić o możliwości posiadania interfejsu API umożliwiającego blokowanie myszy. Będzie to przydatne dla wszystkich twórców gier HTML5 / WebGL.

Jeśli chcesz, przyjdź i zostaw komentarz ze swoją opinią i zagłosuj za problemem:

https://bugzilla.mozilla.org/show_bug.cgi?id=630979

Dzięki!

dionyziz
źródło
9
Aktualizacja: bugzilla.mozilla.org/show_bug.cgi?id=633602 i specyfikacja w3 dla blokady wskaźnika: dvcs.w3.org/hg/pointerlock/raw-file/default/index.html
Chris Anderson
51
Jeśli tak się stanie, zakończę korzystanie z przeglądarki. :-P Poważnie, strony internetowe po prostu nie wymagają takiej zgody, jaką wyrażasz podczas instalacji aplikacji. Byłaby to świetna funkcja, gdybyśmy wszyscy byli miłymi facetami, wykorzystując tylko ten poziom kontroli, aby poprawić wrażenia użytkownika. Niestety Internet zajmuje centralne miejsce w dupie, dlatego istnieje wiele naprawdę fajnych funkcji, których, miejmy nadzieję, nigdy nie zobaczymy w przeglądarce. To powiedziawszy: pełnoekranowy interfejs API działałby w celu „zablokowania” reszty systemu operacyjnego.
Mantriur
4
@Ktoś Zgoda byłaby wymagana, zanim taka blokada byłaby możliwa przez aplikację (podobnie jak teraz w popularnych przeglądarkach internetowych wymagana jest zgoda na pełny ekran). Ponadto użytkownik zawsze może cofnąć zgodę, naciskając klawisz ESC.
dionyziz
7
To się wydarzyło. I jest całkiem niesamowity (jeśli nadal jest poprzedzony prefiksem dostawcy): mdn.github.io/pointer-lock-demo
ericsoco
1
@ericsoco Niestety ten link jest uszkodzony. To może pomóc: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Tian van Heerden
47

Możesz wykryć położenie wskaźnika myszy, a następnie przesunąć stronę internetową (z względną pozycją ciała), aby najechali na to, co chcesz, aby kliknęli.

Na przykład możesz wkleić ten kod na bieżącej stronie w konsoli przeglądarki (a następnie odświeżyć)

var upvote_position = $('#answer-12878316').position();
$('body').mousemove(function (event) {
    $(this).css({
        position: 'relative',
        left: (event.pageX - upvote_position.left - 22) + 'px',
        top: (event.pageY - upvote_position.top - 35) + 'px'
    });        
});
Amish G.
źródło
2
Twój post byłby bardziej wartościowy, gdybyś mógł zamieścić przykładowy kod, który to robi. Proponuję również zajrzeć do FAQ: stackoverflow.com/faq
ForceMagic
Jak właściwie klikasz właściwy element po kliknięciu przez użytkownika?
mmm
@momomo Możesz użyćdocument.getElementByID('thingtoclick').click();
stylu kaskadowym
1
To było niesamowite! Sposób na myślenie nieszablonowe! Wątpię, czy naprawdę zapewnia to, czego chciał pytający, ale tak fajne, jak było, kogo to naprawdę obchodzi?
gcdev
13

Nie możesz poruszać myszą, ale możesz ją zablokować. Uwaga: musisz wywołać requestPointerLock w zdarzeniu click.

Mały przykład:

var canvas = document.getElementById('mycanvas');
canvas.requestPointerLock = canvas.requestPointerLock || canvas.mozRequestPointerLock || canvas.webkitRequestPointerLock;
canvas.requestPointerLock();

Dokumentacja i przykład pełnego kodu:

https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API

Dmitrij Bosikow
źródło
4

Nie możesz przesuwać wskaźnika myszy za pomocą JavaScript, a więc z oczywistych względów bezpieczeństwa. Najlepszym sposobem osiągnięcia tego efektu byłoby umieszczenie kontrolki pod wskaźnikiem myszy.

Sheavi
źródło
1
Implikacje dla bezpieczeństwa nie są oczywiste. W rzeczywistości ostatnie dodatki do standardów wprowadzają tę możliwość bez poważnych problemów z bezpieczeństwem.
dionyziz
ale w takim razie jak to jest możliwe w API przeciągania i upuszczania?
oldboy
1

Ciekawy. Nie jest to bezpośrednio możliwe z powodów wskazanych wcześniej (kliknięcia spamu i wstrzyknięcie złośliwego oprogramowania), ale rozważ ten hack, który stwarza wrażenie tego samego:

Krok 1: Ukryj kursor

Załóżmy, że masz element div, możesz użyć tej właściwości css, aby ukryć prawdziwy kursor:

.your_div {
    cursor: none
}

Krok 2: Wprowadź pseudokursor

Po prostu utwórz obraz, podobny do kursora obraz kursora myszyi umieść go na swojej stronie za pomocą position:absolute.

Krok 3: Śledź rzeczywisty ruch myszy

To jest łatwe. Sprawdź w Internecie, jak uzyskać rzeczywistą lokalizację myszy (współrzędne X i Y).

Krok 4: Przesuń pseudo kursor

Gdy porusza się rzeczywisty kursor, przesuń pseudo kursor o taką samą różnicę X i Y. Podobnie, zawsze możesz wygenerować zdarzenie kliknięcia w dowolnym miejscu na swojej stronie za pomocą magii javascript (po prostu przeszukaj internet, aby dowiedzieć się, jak to zrobić).

Teraz w tym momencie możesz sterować kursorem pesudo tak, jak chcesz, a twój użytkownik będzie miał wrażenie, że prawdziwy kursor się porusza.


Uczciwe ostrzeżenie: nie rób tego. Nikt nie chce, aby jego kursor lub komputer były kontrolowane w ten sposób, chyba że masz jakiś konkretny przypadek użycia lub jesteś zdeterminowany, aby uciec od użytkowników.

Sanjay Verma
źródło
0

Czy nie można tego po prostu zrobić, uzyskując rzeczywistą pozycję wskaźnika myszy, a następnie obliczając i kompensując działania myszy sprite / sceny na podstawie tej kompensacji?

Na przykład potrzebujesz, aby wskaźnik myszy znajdował się na dole pośrodku, ale znajduje się w lewym górnym rogu; ukryj kursor, użyj przesuniętego obrazu kursora. Przesuwaj ruch kursora i mapuj wejście myszy, aby dopasować przesunięte kursorowe kliknięcia sprite (lub „control”). Kiedy / jeśli granice zostaną osiągnięte, przelicz ponownie. Jeśli / kiedy kursor rzeczywiście dotrze do punktu, który chcesz, usuń kompensację.

Zastrzeżenie, a nie twórca gier.

Eric Shoberg
źródło
zasadniczo identyczne z odpowiedzią Xaxis.
mathheadinclouds
@mathheadinclouds rzeczywiście, ale jest niezależne od implementacji blokady myszy w przeglądarce. Więc zasadniczo; ale nie. Dziękuję za twoją opinię. - Edytowano: nieważne. Rozumiem, co mówisz. Myślę więc, że jedyną moją myślą byłoby, to tutaj nie jest nieprzydatne. Jest w tym więcej laików niż odpowiedź Xaxis.
Eric Shoberg