Перемістити вказівник миші на певну позицію?


127

Я будую гру HTML5, і я намагаюся навести курсор миші на певний елемент управління певною подією, щоб переміщення у певному напрямку завжди мало однаковий результат. Чи можливо це?


Якщо я правильно розумію, ви хочете перемістити курсор миші за допомогою JS - це неможливо. Вам потрібно буде знайти інший спосіб.
тридцятьдот

1
У HTML5 є деякі нові події миші, але нічого, щоб рухати мишкою. Ви завжди можете window.moveBy (x, y); щоб перемістити вікно під тим, де кладеться миша .. це була б досить прикольна гра :) Єдиний інший спосіб, як я бачу, це робиться через ActiveX - ewwww, yuk!
Джеремі Томпсон

1
Ні - JavaScript не дозволить вам це зробити, але, мабуть, може бути вирішення проблеми, що передбачає переміщення сторінки до певного місця, яке також "перемістить" курсор, використовуючи вікно scrollTo () - див. W3Schools на w3schools.com/jsref/met_win_scrollto.asp .
Stardust

1
Удачі з переміщенням миші на смартфонах.
Cœur

Зображення вказівника миші можна переміщувати та встановлювати курсор: немає. Це не ризик для безпеки, оскільки ви програміст. Якщо ви можете зробити гру, ви також можете уникнути ризику натиснути на свій банківський рахунок під час гри.

Відповіді:


20

Отже, я знаю, що це стара тема, але спершу скажу, що це неможливо. Найближчим на даний момент є фіксація миші в одному положенні та відстеження змін у своїх x та y. Ця концепція була прийнята - схоже - Chrome і Firefox. Це управляється тим, що називається Замиканням миші , і потрапляння втечі зламає це. З мого короткого ознайомлення я думаю, що ідея полягає в тому, що вона блокує мишу в одному місці та повідомляє про події руху, схожі на події клацання та перетягування.

Ось документація щодо випуску:
FireFox: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Chrome: http://www.chromium.org/developers/design-documents/mouse-lock

І ось досить акуратна демонстрація: http://media.tojicode.com/q3bsp/


Я сприймаю це як нову прийняту відповідь, оскільки це саме той варіант використання, про який я просив, хоча він підтримується не у всіх браузерах.
Денкстер

187

Не можна переміщувати курсор миші за допомогою JavaScript.

Подумайте про наслідки на секунду, якщо зможете;)

  1. Користувач думає: "Ей, я хотів би натиснути це посилання"
  2. Javascript переміщує курсор миші на інше посилання
  3. Користувач натискає неправильне посилання та ненавмисно завантажує зловмисне програмне забезпечення, яке форматує його c-диск та їсть його цукерки

74
РЕАЛЬНИЙ клік-джек.
Блендер

15
Подумайте, це було б приголомшливо: P
Мартін Йесперсен

24
Хе, я б ненавиджу боротьбу за контроль над курсором миші: ЗАДАЧАЙТЕ РЕКЛАМИ, НАЗАД Я СПРАВУЮ!
Блендер

78
Веб-сторінка може змусити завантаження, не вимагаючи від кого-небудь натискати посилання, тому те, що ви заявляєте, насправді не є проблемою безпеки. Однак неможливо перейти за межі вікна веб-сторінки.
dioyziz

11
@dionyziz: Існує досить велика різниця між примусовим завантаженням у пісочну скриньку та завантаженням користувацького простору, розпочатого взаємодією користувача. Наслідки для безпеки насправді дуже великі.
Мартін Єсперсен

88
  1. Запустіть невеликий веб-сервер на клієнтській машині. Це може бути невелика річ у 100 кб. Сценарій Python / Perl тощо.
  2. Включіть невеликий заздалегідь складений виконуваний файл C, який може переміщувати мишу.
  3. Запустіть його як CGI-скрипт за допомогою простого http-дзвінка, AJAX, незалежно від цього - з координатами, до яких потрібно перемістити мишу, наприклад:

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

PS: Для будь-якої проблеми є сотні виправдань, чому і як - цього не можна і не слід робити .. Але в цьому нескінченному Всесвіті це справді лише питання визначення - чи ВАС зробить це.


13
Я думаю, що всі ми були на борту, поки "c виконується" ... xD
dGRAMOP

1
веб-сервер? можливо ви маєте на увазі програму з http-інтерфейсом .. немає потреби в Інтернеті. Мова програмування Go може бути вигідним порівняно з C тим, що може полегшити додавання частини http, або, альтернативно, інтерпретатор nodejs запустить код, який також може легко включати інтерфейс http, оскільки інтерпретатор nodejs побудований для того, щоб зробити його легким писати серверні програми.
барлоп

3
C = 0 залежності. Web - це http. Тут немає милої домашньої сторінки. Просто транспорт.
Алекс Грей

+1 для PS. Чи можемо ми виконати виклики CGI, використовуючи node dev-сервер або щось подібне npmjs.com/package/http-server ??
АТЕР

1
Хтось із вас коли-небудь помічав Javascriptтег під питанням?

80

Я думаю, ви могли б встановити курсор миші на задану область екрану, якби ви не використовували реальний (системний) курсор миші.

Наприклад, ви можете створити зображення, щоб діяти замість курсору, обробляти подію, яка при виявленні миші у вашій сцені встановила стиль системного курсору на "none" ( sceneElement.style.cursor = 'none'), а потім виведе прихований елемент зображення, що діє як курсор, де ви хочете, щоб у сцені, базуючись на заздалегідь визначеному перекладі осі / обмежувального поля.

Таким чином, незалежно від того, як ви перемістили реальний курсор, ваш метод перекладу зберігатиме курсор зображення там, де вам це потрібно.

edit: приклад у jsFiddle з використанням зображення зображення та примусового руху миші


5
Так, ти можеш. Ви просто встановите стиль курсору для даного елемента на "none". Спробувати.
Xaxis

14
Це найбільш продумана відповідь. І насправді надає справжнє рішення, в той час як деякі інші відповіді не додають жодної цінності :) Але як webgl принесе такі цікаві ігри, як FPS тощо, коли ми не зможемо заблокувати миші, це звучить досить обмежуюче ...
Dennkster

3
Проблема все ще не в змозі "продовжувати рухати" мишкою ліворуч. Як тільки миша покине веб-сторінку, ви не можете продовжувати її контролювати.
dioyziz

2
Це ідеальне рішення цієї проблеми. Єдина причина, через яку люди скаржаться, це те, що це не тривіальне рішення. Ви мусите іноді програмувати, хлопці!
Марті

5
пограв із цією ідеєю і зробив приклад у JSFiddle jsfiddle.net/jaakkytt/9uczV
Jaak Kütt

65

Чудове запитання. Це дійсно щось не вистачає в API браузера Javascript. Я також працюю над грою WebGL зі своєю командою, і нам потрібна ця функція. Я відкрив проблему про bugzilla Firefox, щоб ми могли почати говорити про можливість існування API, щоб дозволити блокування миші. Це стане в нагоді для всіх розробників ігор HTML5 / WebGL там.

Якщо вам подобається, завітайте та залиште коментар зі своїми відгуками та підтвердіть питання:

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

Дякую!


9
Оновлення: bugzilla.mozilla.org/show_bug.cgi?id=633602 та специфікація w3 для блокування покажчика: dvcs.w3.org/hg/pointerlock/raw-file/default/index.html
Кріс Андерсон

51
Якщо це станеться, я перестану користуватися браузером. :-П Серйозно, веб-сайти просто не вимагають тієї згоди, яку ви даєте під час встановлення програми. Це було б чудовою особливістю, якби ми всі хороші хлопці просто використовували цей рівень контролю, щоб покращити роботу користувачів. На жаль, Інтернет є основним мудаком, саме тому існує дуже багато акуратних функцій, яких ми, сподіваємось, ніколи не побачимо в браузері. Це було сказано: Повноекранний API працюватиме, щоб "заблокувати" решту ОС.
Хтось

4
@Someone Consent буде запитуватися до того, як таке блокування стане можливим додатком (подібно до того, як зараз вимагається згода на повний екран у популярних веб-браузерах). Крім того, користувач завжди може відкликати згоду, натиснувши клавішу ESC.
діонізіз

7
Це сталося. І це досить приголомшливо (якщо все-таки постачальник постачальників): mdn.github.io/pointer-lock-demo
ericsoco

1
@ericsoco На жаль, посилання розірвана. Це може допомогти: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Tian van Heerden

46

Ви можете виявити положення вказівника миші, а потім перемістити веб-сторінку (з відношенням положення тіла), щоб вони навели курсор на те, що ви хочете, щоб вони натискали.

Наприклад, ви можете вставити цей код на поточну сторінку в консолі веб-переглядача (і оновити після цього)

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

2
Ваш пост був би більш цінним, якби ви могли розмістити приклад коду, який це робить. Крім того , я пропоную вам поглянути на FAQ: stackoverflow.com/faq
ForceMagic

Як ви насправді натискаєте на потрібний елемент, як тільки користувач клацає?
ммм

@momomo Можна використовуватиdocument.getElementByID('thingtoclick').click();
каскадний стиль

1
Це було абсолютно зоряно! Спосіб мислити нестандартно! Я сумніваюся, що це дійсно забезпечує те, що хотів запитувач, але як круто, як це було, кого насправді хвилює?
gcdev

12

Ви не можете перемістити мишу, але можете заблокувати її. Зауважте: що вам потрібно викликати requestPointerLock у події клацання.

Маленький приклад:

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

Приклад документації та повний код:

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


4

Ви не можете переміщувати вказівник миші за допомогою javascript і, таким чином, з очевидних міркувань безпеки. Найкращим способом досягти цього ефекту було б фактично розмістити елемент управління під вказівником миші.


1
Наслідки для безпеки далеко не очевидні. Насправді останні доповнення до стандартів запроваджують цю здатність без серйозних проблем безпеки.
dioyziz

але як це можливо в API перетягування?
oldboy

0

Чи не можна цього просто зробити, встановивши фактичне положення вказівника миші, а потім обчислити та компенсувати дії спрайт / сцени миші на основі цієї компенсації?

Наприклад, вам потрібен вказівник миші на нижній центр, але він сидить у верхньому лівому куті; прихойте курсор, використовуйте зміщене зображення курсору. Перемістіть рух курсору та введіть карту миші, щоб відповідати переставленим клавішам спрайту курсора (або "управління"). Якщо / коли курсор насправді потрапить на точку, яку ви хочете, це буде, видаліть компенсацію.

Відмова, не розробник ігор.


ідентичний відповіді Xaxis, по суті.
mathheadinclouds

@mathheadinclouds дійсно, але не залежить від реалізації браузера миші. Отже, по суті; але ні. Дякую, за вашу думку. - Відредаговано: Неважливо. Я бачу, що ти кажеш. Я здогадуюсь тоді, моя єдина думка була б, це тут не непотрібно. У цьому є більше мирян, ніж відповідь Xaxis.
Ерік Шоберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.