2013-08-05 14 views
20

Son 30 dakikayı aradım ama bir çözüm bulamadım.elle tetikleme etkinliğini tetikle

Bir öğe üzerinde touchstart olayını tetiklemek istiyorum.

Bu touchstart etkinlik tetikleyecek: değişkenler benim fonksiyonu

tarafından tanımlanan Ama bir sorun bununla var olan

var e = document.createEvent('MouseEvent'); 

e.initMouseEvent("touchstart", true, true, window, 1, screenX, screenY, clientX, clientY, 
    ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget); 

target.dispatchEvent(e); 

Not söyledi. event nesnesinin bir touches özelliği yoktur. Yani böyle bir şey çalışmaz:

var touch = e.touches[0]; 

elle touchstart olayı tetiklemek için bir yolu var mı (o [DevTools] etkin dokunuşla Android> = 4.0 ve Chrome çalışması gerekir)?

Lütfen jQuery gibi bir çerçeveyi kullanmak istemediğimi unutmayın. jQuery ile bir eleman üzerinde touchevent oluşturmak kolaydır; Sonra W3C

var e = document.createEvent('TouchEvent'); 

göre)

+1

Sadece akıl sağlığı için neden bir etkinlik oluşturmanız gerekiyor? – Halcyon

+0

Peki, bir kapsayıcı olduğunu söyle. Bu kapsayıcının gizli olan birçok alt öğesi vardır. Bu konteynere dokunduğumda, bir subcontainer görünür hale gelir ve konteynere dokunduğum sürece, parmağımı hareket ettirerek subcontainer'ı hareket ettirebilmem gerekir. Bu yüzden konteynere dokunduğumda, subcontainer'da bir 'touchstart' olayı yaratılmalıdır. – AndreM96

+1

Olayları taklit etmeden yapılması oldukça kolay olması gereken bir şey gibi geliyor. Modeliniz konteynır bağımlılığını biliyorsa, tek orijinal etkinlikten tümünü kontrol edebilirsiniz. – Halcyon

cevap

20

da değiştirmek

e.initMouseEvent(); 

'senin gibi

e.initTouchEvent(); 

için ve bir touchstart etkinliği oluşturdu.

W3C bağlantı diyor ki:

Some user agents implement an initTouchEvent method as part of the TouchEvent interface. When this method is available, scripts can use it to initialize the properties of a TouchEvent object, including its TouchList properties (which can be initialized with values returned from createTouchList). The initTouchEvent method is not yet standardized, but it may appear in some form in a future specification.

Yani ek olarak e.initUIEvent('touchstart', true, true);
başvurmak gerekebilir edeceğiz resmi spec de TouchList nesne isteğe ve manuel oluşturulabilir belirtmektedir createTouchList yöntemini kullanarak. o listeye bir dokunuş eklemek için, tüm koordinatları ve geçmek olacak createTouch yöntemi çağırmak gerekecek öyle: Bu işe yaramazsa

 
6.1 Methods 

#createTouch 
Creates a Touch object with the specified attributes. 
Parameter | Type  | Nullable | Optional | Description 
view  | WindowProxy | ✘  | ✘  | 
target | EventTarget | ✘  | ✘  | 
identifier| long  | ✘  | ✘  | 
pageX  | long  | ✘  | ✘  | 
pageY  | long  | ✘  | ✘  | 
screenX | long  | ✘  | ✘  | 
screenY | long  | ✘  | ✘  | 
Return type: Touch 

#createTouchList 
Creates a TouchList object consisting of zero or more Touch objects. Calling this method with no arguments creates a TouchList with no objects in it and length 0 (zero). 

Parameter | Type | Nullable | Optional | Description 
touches | Touch |  ✘ | ✔  | 
Return type: TouchList 

, bu deneyebilirsiniz:

var e = document.createEvent('UIEvent'); 
e.initUIEvent(); 

... o her halükarda createEvent('MouseEvent') daha mantıklı,
Ama test amacıyla, neden krom konsolu açıp Emulate touch events kontrol artı 4. Android'e kullanıcı ajanı geçersiz kılmaz (Ctrl + Shift çalışması gerekir + j> sağ alt köşeyi tıklayın ve Ov'ı seçin. errides, orada henüz (dokunmatik olaylar onların standartlaştırılmış olma açısından hala gidecek çok yol var olduğundan, touches mülkiyet değil RO olduğu ortaya çıktı ihtiyacınız olan tüm ayarları)

bulacaksınız ?Eğer OP) bulundu ve istenen sonuçla kullanılan bu hızlı-fix (kullanabilmesi),:

var e = document.createEvent('TouchEvent'); 
e.touches = [{pageX: pageX, pageY: pageY}]; 

Ki, ben (o durum böyle olsaydı inanamıyorum) olduğunu düşünüyorum böyle tetikleyebilir

e.touches = e.createTouchList(
    e.createTouch(window, target, 0, pageX, pageY, screenX, screenY) 
); 
+0

İlk olarak, bu cevap için teşekkürler! :) Bunu da denedim ama işe yaramadı ... CreateEvent ('TouchEvent') 'hakkında iyi bir dokümantasyon yok. :/Ve Chrome'da şu hatayı alıyorum: 'Yakalanmamış Hata: NotSupportedError: DOM İstisna 9'. Ve '[DevTools] ile sorduğum soruda, dev araçların etkin bir şekilde etkinleştirildiğini kastettim. ;) – AndreM96

+2

@ AndreM96: Bulunamadı: 'TouchList' nesnesi isteğe bağlıdır ve sırasıyla "createTouchList" ve "createTouch" yöntemlerini kullanarak bir "Touch" nesnesini elle oluşturmanız gerekir. –

+0

Teşekkürler! Bu işe yarıyor. Şu an kullandığım basit bir çözüm buldum: "e.touches = [{pageX: pageX, pageY: pageY}];" ('e' oluşturulan olaydır). Ama çözümünüz kesinlikle daha iyi! – AndreM96

-4

: daha hızlı

$playBtn.bind((is_touch_device) ? 'touchstart' : 'click', playfunction); 
+2

Lütfen JavaScript etiketinin kısa açıklamasını kontrol edin: _ "Çerçeve/kütüphane için bir etiket de eklenmediği sürece, salt bir JavaScript cevabı beklenir" _, farenizi üzerine getirin. JQ etiketi yok, jQ cevapları yok ... –

+0

Sadece sorumu güncelledim. Evet, herhangi bir çerçeve kullanmak istemiyorum. ;) – AndreM96

4

Bu cevap olmuştur biliyorum, ama ben de bu sorunun cevabını bulmak için mücadele etti ve kabul edilen cevabı için işe yaramadı ben mi. Sonunda, bulduğum çözüm gerçekten çok basittir ve tarayıcılar arasında desteğe sahiptir:

var e = new Event('touchstart'); 
target.dispatchEvent(e); 

İşte bu kadar. Daha kolay olamazdı.

+0

Hedef nedir? – scord

+0

@scord 'target' –

+0

için etkinliğinizi göndermek istediğiniz bir öğedir Ne yazık ki tarayıcılar arasında mevcut destek seviyesi ile bu çok sağlam olmamasına rağmen en geçerli çözüm olarak görünmektedir. Sadece genel bir etkinlik oluşturun ve ihtiyaç duyduğunuz tüm özellikleri "gerçek" bir dokunma olayı gibi elle doldurun. –