Fare imlecini belirli bir konuma taşımak?


127

Bir HTML5 oyunu geliştiriyorum ve fare imlecini belirli bir olaydaki belirli bir kontrolün üzerine getirmeye çalışıyorum, böylece belirli bir yönde hareket etmek her zaman aynı sonucu verir. Mümkün mü?


Doğru anladıysam, fare imlecini JS kullanarak hareket ettirmek istiyorsunuz - bu mümkün değil. Başka bir yol bulman gerekecek.
otuz nokta

1
HTML5'te bazı yeni Fare Etkinlikleri var, ancak fareyi hareket ettirecek hiçbir şey yok. Her zaman window.moveBy (x, y); pencereyi farenin gezindiği yerin altına taşımak için .. bu oldukça eğlenceli bir oyun olurdu :) Bunun yapılmakta olduğunu gördüğüm tek othadox yolu ActiveX - ewwww, yuk!
Jeremy Thompson

1
Hayır - JavaScript bunu yapmanıza izin vermez, ancak sanırım sayfayı belirli bir konuma taşımayı içeren ve ayrıca scrollTo () penceresini kullanarak imleci "hareket ettirecek" bir geçici çözüm olabilir - bkz. W3Schools w3schools.com/jsref/met_win_scrollto.asp adresinde .
Stardust

1
Akıllı telefonlarda fareyi hareket ettirmede iyi şanslar.
Cœur

Fare işaretçisinin görüntüsü hareket ettirilebilir ve imleci ayarlayabilir: yok. Programcı olduğunuz için bu bir güvenlik riski değildir. Bir oyun yapabilirseniz, oyununuzu oynarken banka hesabınıza tıklama riskinden de kurtulabilirsiniz.

Yanıtlar:


20

Bu yüzden bunun eski bir konu olduğunu biliyorum ama önce bunun mümkün olmadığını söyleyeceğim. Şu anda en yakın şey fareyi tek bir konuma kilitlemek ve x ve y'deki değişikliği takip etmektir. Bu konsept - görünüşe göre - Chrome ve Firefox tarafından benimsenmiştir. Fare Kilidi denen şey tarafından yönetilir ve kaçışa basmak onu kırar. Benim itibaren kısa salt yukarı, ben fikir bir yere fareyi kilitler ve olayları ve sürükle-tıklayın benzer hareket olayları bildirir olduğunu düşünüyorum.

İşte sürüm belgeleri:
FireFox: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Chrome: http://www.chromium.org/developers/design-documents/mouse-lock

Ve işte oldukça güzel bir gösteri: http://media.tojicode.com/q3bsp/


Bunu yeni kabul edilen cevap olarak alıyorum, çünkü bu, tüm tarayıcılarda desteklenmese de tam olarak istediğim kullanım durumuydu.
Dennkster

188

Fare işaretçisini javascript ile hareket ettiremezsiniz.

Yapabilirseniz, bir saniyeliğine sonuçlarını düşünün;)

  1. Kullanıcı şunu düşünüyor: "Hey, bu bağlantıyı tıklamak istiyorum"
  2. Javascript fare imlecini başka bir bağlantıya taşır
  3. Kullanıcı yanlış bağlantıya tıklar ve istemeden C sürücüsünü biçimlendiren ve şekerini yiyen kötü amaçlı yazılımları indirir

74
GERÇEK clickjacking.
Blender

15
Bir düşünün, bu harika olurdu: P
Martin Jespersen

24
Heh, fare imlecimi kontrol etmek için savaşmaktan nefret ederim: REKLAMLARA GERİ DÖN, DİYORUM!
Blender

78
Bir web sayfası, kimsenin bir bağlantıya tıklamasını gerektirmeden bir indirme işlemini zorlayabilir, bu nedenle iddia ettiğiniz şey gerçekten bir güvenlik sorunu değildir. Yine de, web sayfası penceresinin dışına çıkamamak.
dionyziz

11
@dionyziz: Sandbox'a zorunlu indirme ile kullanıcı etkileşimi tarafından başlatılan kullanıcı alanı indirme arasında oldukça büyük bir fark var. Güvenlik etkileri aslında çok büyük.
Martin Jespersen

88
  1. İstemci makinede küçük bir web sunucusu çalıştırın. 100kb'lik küçük bir şey olabilir. Bir Python / Perl betiği vb.
  2. Fareyi hareket ettirebilen küçük, önceden derlenmiş bir C çalıştırılabilir dosyası içerir.
  3. Basit bir http çağrısı, AJAX, ne olursa olsun, fareyi hareket ettirmek istediğiniz koordinatlarla CGI-komut dosyası olarak çalıştırın, örneğin:

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

Not: Herhangi bir sorun için, neden ve nasıl - yapılamaz ve yapılmaması gerektiğine dair yüzlerce mazeret vardır .. Ama bu sonsuz evrende, bu gerçekten sadece bir belirleme meselesi - SİZİN bunu gerçekleştirecek.


13
Sanırım hepimiz "c çalıştırılabilir" olana kadar
gemideydik

1
bir web sunucusu? belki de http arayüzlü bir programı kastediyorsunuz .. web'e gerek yok. Go programlama dili, http bölümünü eklemeyi kolaylaştırması açısından C'ye göre avantajlı olabilir veya alternatif olarak nodejs yorumlayıcısı, kolay bir şekilde bir http arabirimi de içerebilen kodu çalıştırabilir, çünkü nodejs yorumlayıcısı sunucu uygulamalarını yazın.
barlop

3
C = 0 bağımlılıklar. Web http'dir. Burada şirin bir ana sayfa yok .. Sadece ulaşım.
Alex Grey

PS için +1. Node dev-server veya benzeri npmjs.com/package/http-server kullanarak CGI çağrılarını yürütebilir miyiz ?
2018

1
Hiç kimse Javascriptsorunun altındaki etiketi fark etti mi?

80

Gerçek (sistem) fare imlecini kullanmadıysanız, fare imlecini ekranın belirli bir alanına yerleştirmeyi başarabileceğinizi hayal ediyorum.

Örneğin, imlecinizin yerine hareket etmesi için bir görüntü oluşturabilir, farenizin sahnenize girmesini algıladığınızda, sistem imlecindeki stili 'yok' ( sceneElement.style.cursor = 'none') olarak ayarlayan ve ardından hareket eden gizli bir görüntü öğesini ortaya çıkaran bir olayı işleyebilirsiniz. önceden tanımlanmış eksen / sınırlayıcı kutu çevirisine dayalı olarak sahnede istediğiniz herhangi bir yerde olmak için bir imleç olarak.

Bu şekilde, gerçek imleci nasıl hareket ettirdiğiniz önemli değil, çeviri yönteminiz görüntü imlecinizi ihtiyacınız olan her yerde tutacaktır.

edit: jsFiddle'da bir resim gösterimi ve zorla fare hareketi kullanan bir örnek


5
Evet yapabilirsin. Belirli bir öğedeki imleç stilini 'yok' olarak ayarlamanız yeterlidir. Bir şans ver.
Xaxis

14
Bu en düşünceli cevap. Biz herhangi bir fare kilidi alınamıyor zaman diğer bazı cevaplar oldukça sınırlayıcı olduğunu sesleri gerçekten hiçbir yararı dot :) Ama FPS vb gibi ilginç oyunlar getirmek WebGL nasıl ederken aslında ..., gerçek bir çözüm sağlar
Dennkster

3
Yine de farenizi sola "hareket ettirememe" sorunu var. Fare web sayfasından ayrıldığında, onu kontrol etmeye devam edemezsiniz.
dionyziz

2
Bu, bu soruna mükemmel bir çözümdür. İnsanların şikayet etmelerinin tek nedeni, bunun önemsiz bir çözüm olmamasıdır. Bazen biraz programlama yapmanız gerekir çocuklar!
Marty

5
bu fikir etrafında oynadı ve JSFiddle jsfiddle.net/jaakkytt/9uczV'de
Jaak Kütt

65

Harika soru. Bu gerçekten Javascript tarayıcı API'sinde eksik olan bir şeydir. Ayrıca ekibimle bir WebGL oyunu üzerinde çalışıyorum ve bu özelliğe ihtiyacımız var. Firefox'un bugzilla'sında bir sorunu açtım, böylece fare kilitlemesine izin veren bir API'ye sahip olma olasılığı hakkında konuşmaya başlayabiliriz. Bu, dışarıdaki tüm HTML5 / WebGL oyun geliştiricileri için faydalı olacak.

İsterseniz, geri bildiriminizle birlikte bir yorum bırakın ve sorunu destekleyin:

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

Teşekkürler!



51
Bu olursa, bir tarayıcı kullanmaktan çıkacağım. :-P Cidden, web siteleri bir uygulamayı yüklediğinizde verdiğiniz izni gerektirmez. Hepimiz kullanıcı deneyimini iyileştirmek için bu kontrol düzeyini kullanan iyi insanlar olsaydık, bu harika bir özellik olurdu. Ne yazık ki İnternet pislik merkezindedir, bu yüzden tarayıcıda asla göremeyeceğimizi umduğumuz pek çok düzgün özellik vardır. Olduğu söyleniyor: Tam ekran API, işletim sisteminin geri kalanını "kilitlemek" için çalışır.
Birisi

4
@ Bir uygulama tarafından böyle bir kilit mümkün olmadan önce Birinin Onayı istenir (popüler web tarayıcılarında şu anda tam ekran onayının talep edilmesine benzer). Ayrıca, kullanıcı ESC tuşuna basarak izni her zaman iptal edebilir.
dionyziz

7
Oldu. Ve oldukça harika (hala sağlayıcı önekli ise): mdn.github.io/pointer-lock-demo
ericsoco

1
@ericsoco Maalesef bu bağlantı koptu. Bu yardımcı olabilir: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Tian van Heerden

46

Fare işaretçisinin konumunu algılayabilir ve ardından web sayfasını (vücut konumu göreceli olarak) hareket ettirebilir, böylece tıklamalarını istediğiniz şeyin üzerine gelebilirler.

Örnek olarak, bu kodu tarayıcı konsolunuzun mevcut sayfasına yapıştırabilirsiniz (ve daha sonra yenileyebilirsiniz)

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
Bunu yapan bir kod örneği gönderebilirseniz gönderiniz daha değerli olacaktır. Ayrıca, SSS bölümüne bir göz
atmanızı öneririm

Kullanıcı tıkladığında doğru öğeyi gerçekten nasıl tıklıyorsunuz?
mmm

@momomo Kullanabilirsinizdocument.getElementByID('thingtoclick').click();
basamaklı stil

1
Bu tamamen yıldızdı! Kutunun dışında düşünmenin yolu! Sorgulayanın istediğini gerçekten sağladığından şüpheliyim, ama ne kadar havalı olsa da, kimin gerçekten umurunda?
gcdev

12

Fareyi hareket ettiremezsiniz ama kilitleyebilirsiniz. Not: click olayında requestPointerLock'u aramanız gerekir.

Küçük Örnek:

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

Belgeler ve tam kod örneği:

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


4

Fare işaretçisini javascript kullanarak ve dolayısıyla bariz güvenlik nedenleriyle hareket ettiremezsiniz. Bu efekti elde etmenin en iyi yolu, kontrolü gerçekten fare imlecinin altına yerleştirmektir.


1
Güvenlik etkileri çok açık değil. Aslında, standartlara yapılan son eklemeler, herhangi bir ciddi güvenlik sorunu olmadan bu yeteneği sunar.
dionyziz

ama sonra sürükle ve bırak API'sinde nasıl mümkün olabilir?
oldboy

0

Bu basitçe, fare işaretçisinin gerçek konumunu alarak ve ardından bu telafiye bağlı olarak hareketli yazı / sahne fare eylemlerini hesaplayıp telafi ederek yapılamaz mı?

Örneğin, fare işaretçisinin alt orta olması gerekir, ancak sol üstte bulunur; imleci gizleyin, kaydırılmış bir imleç görüntüsü kullanın. İmleç hareketini kaydırın ve yeniden konumlandırılmış imleç hareketli grafik (veya 'kontrol') tıklamalarıyla eşleşecek şekilde harita fare girdisini kaydırın Sınırlara ulaşıldığında / varsa yeniden hesaplayın. İmleç gerçekte olmasını istediğiniz noktaya ulaştığında / olduğunda, telafiyi kaldırın.

Sorumluluk reddi beyanı, oyun geliştiricisi değil.


esasen Xaxis cevabıyla aynı.
mathheadinclouds

@mathheadinclouds, ancak fare kilidinin tarayıcı uygulamasından bağımsızdır. Yani esasen; Ama değil. Fikrin için teşekkür ederim. - Düzenlendi: Boşver. Ne dediğini anlıyorum. Öyleyse sanırım tek düşüncem buradaki işe yaramaz değil. Xaxis'in cevabından daha fazla meslekten olmayan kişi var.
Eric Shoberg

0

İlginç. Bu, daha önce belirtilen nedenlerle (spam tıklamaları ve kötü amaçlı yazılım yerleştirme) doğrudan mümkün değildir, ancak aynı izlenimi yaratan bu saldırıyı düşünün:

Adım 1: İmleci gizleyin

Bir div'iniz olduğunu varsayalım, gerçek imleci gizlemek için bu css özelliğini kullanabilirsiniz:

.your_div {
    cursor: none
}

2. Adım: Sözde imleci tanıtın

Basitçe bir görüntü, imleç benzer bir görünüm oluşturun ve bunu web sayfanıza position = 'absolute' ile yerleştirin.

3. Adım: Gerçek fare hareketini izleyin

Bu kolay. Gerçek fare konumunu nasıl elde edeceğinizi öğrenmek için interneti kontrol edin (X ve Y koordinatları).

4. Adım: Sözde imleci hareket ettirin

Gerçek imleç hareket ettikçe, sözde imlecinizi aynı X & Y farkı kadar hareket ettirin. Benzer şekilde, javascript magic ile web sayfanızın herhangi bir yerinde her zaman bir tıklama etkinliği oluşturabilirsiniz (sadece internette nasıl yapılır konusunda arama yapın).

Şimdi bu noktada, sözde imleci istediğiniz şekilde kontrol edebilirsiniz ve kullanıcınız gerçek imlecin hareket ettiği izlenimini edinir.

====

Adil Uyarı: Yapmayın. Belirli bir kullanım durumunuz yoksa veya kullanıcılarınızı kaçırmaya kararlı değilseniz, kimse imlecinin veya bilgisayarının bu şekilde kontrol edilmesini istemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.