2013-08-05 15 views
20

मैंने पिछले 30 मिनट की खोज की, लेकिन समाधान नहीं मिला।मैन्युअल रूप से स्पर्श ईवेंट ट्रिगर करें

मैं एक तत्व पर एक touchstart घटना ट्रिगर करते हैं।

यह आग touchstart घटना:

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

ध्यान दें कि चर मेरी समारोह

द्वारा परिभाषित कर रहे लेकिन वहाँ उस के साथ एक समस्या है। event ऑब्जेक्ट में touches संपत्ति नहीं है। तो कुछ इस तरह काम नहीं करेगा:

var touch = e.touches[0]; 

वहाँ मैन्युअल रूप से एक touchstart घटना को गति प्रदान करने का कोई तरीका है (यह स्पर्श के साथ एंड्रॉयड> = 4.0 और क्रोम पर काम करना चाहिए सक्षम [DevTools])?

कृपया ध्यान दें, है कि मैं नहीं jQuery की तरह किसी भी ढांचे का उपयोग करना चाहते हैं। jQuery के साथ यह एक तत्व पर एक touchevent बनाने के लिए आसान है;)

+1

सिर्फ सैनिटी के लिए, आपको एक कार्यक्रम उत्पन्न करने की आवश्यकता क्यों है? – Halcyon

+0

अच्छा, मान लें कि मेरे पास एक कंटेनर है। इस कंटेनर में कई उप-संयोजक हैं जो छुपाए गए हैं। जब मैं इस कंटेनर पर स्पर्श करता हूं, तो एक उप-संयोजक दिखाई देता है, और जब तक मैं कंटेनर को स्पर्श करता हूं, तो मुझे अपनी अंगुली को स्थानांतरित करके उप-संयोजक को स्थानांतरित करने में सक्षम होना चाहिए। इसलिए जब मैं कंटेनर पर स्पर्श करता हूं, तो उप-संयोजक पर 'टचस्टार्ट' ईवेंट बनाया जाना चाहिए। – AndreM96

+1

ऐसा लगता है कि घटनाओं को फेंकने के बिना कुछ करना आसान होना चाहिए। यदि आपका मॉडल कंटेनर निर्भरता के बारे में जानता है तो आप सभी मूल ईवेंट से नियंत्रित कर सकते हैं। – Halcyon

उत्तर

20

W3C

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

तब के अनुसार, भी बदल

e.initMouseEvent(); 

को
e.initTouchEvent(); 

आप के रूप में ' हमने touchstart ईवेंट बनाया है।

W3C लिंक का कहना है:

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.

तो तुम e.initUIEvent('touchstart', true, true);
इसके अलावा का सहारा लेना पड़ सकता है होगा, अधिकारी कल्पना भी कहा गया है कि TouchList वस्तु वैकल्पिक है, और मैन्युअल रूप से बनाया जा सकता है createTouchList विधि का उपयोग कर। उस सूची में एक स्पर्श जोड़ने के लिए, आप createTouch विधि है, जहां आप सभी निर्देशांक और पास भेज देंगे फोन करना होगा इस तरह:

 
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 

यदि वह काम नहीं करता है, तो आप इस कोशिश कर सकते:

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

काम करना चाहिए, यह createEvent('MouseEvent') किसी भी दर की तुलना में अधिक समझ में आता है ...
लेकिन परीक्षण प्रयोजनों के लिए, क्यों नहीं अपने क्रोम कंसोल खोलें तथा Emulate touch events जाँच, प्लस Android में 4. उपयोगकर्ता एजेंट को ओवरराइड (Ctrl + Shift + जे> गियर नीचे दाएं कोने पर क्लिक करें, और ओवी का चयन करें errides, वहाँ आप आप की जरूरत सभी सेटिंग्स)

अभी तक मिल जाएगा के बाद से स्पर्श घटनाओं एक लंबा रास्ता तय करने के लिए, अभी भी उनके मानकीकृत बनने के संदर्भ में है, यह पता चला है touches संपत्ति आरओ नहीं है (?), तो आप इस जल्दी ठीक (ओ पी पाया जाता है और वांछित परिणाम के साथ प्रयोग किया है) का उपयोग कर सकते हैं:

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

कौन सा, मुझे लगता है कि (मैं इस पर विश्वास नहीं कर सकते हैं अगर यह मामला नहीं थे) है तेजी से:

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

सबसे पहले, इस उत्तर के लिए धन्यवाद! :) मैंने यह भी कोशिश की है, लेकिन यह काम नहीं किया ... 'createEvent ('TouchEvent') 'पर कोई अच्छा दस्तावेज नहीं है। :/और क्रोम में मुझे यह त्रुटि मिलती है: 'असीमित त्रुटि: नहीं समर्थित किया गया त्रुटि: डोम अपवाद 9'। और मेरे प्रश्न में '[देवतुल्स]' के साथ मेरा मतलब था कि मेरे पास देव उपकरण स्पर्श सक्षम थे। ;) – AndreM96

+2

@ AndreM96: यह मिल गया: 'TouchList' वस्तु वैकल्पिक है, और आप मैन्युअल रूप से क्रमश:' createTouchList' और 'createTouch' तरीकों का उपयोग कर –

+0

धन्यवाद एक' Touch' वस्तु बनाने के लिए होगा! यह काम करता है। मुझे एक सरल कामकाज मिला जो अब मैं उपयोग करता हूं: 'e.touches = [{pageX: pageX, पृष्ठY: पृष्ठY}]; '(' e' बनाई गई घटना है)। लेकिन आपका समाधान निश्चित रूप से बेहतर है! – AndreM96

-4

हम इस तरह को गति प्रदान कर सकते हैं:

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

कृपया, जावास्क्रिप्ट टैग का संक्षिप्त वर्णन देखें: _ "जब तक ढांचे/पुस्तकालय के लिए टैग भी शामिल नहीं है, तब तक एक शुद्ध जावास्क्रिप्ट उत्तर अपेक्षित है" _, बस अपने माउस को उस पर होवर करें। कोई jQ टैग नहीं है, कोई jQ उत्तर नहीं ... –

+0

मैंने अभी अपना प्रश्न अपडेट किया है। हां, मैं किसी भी प्रकार के ढांचे का उपयोग नहीं करना चाहता हूं। ;) – AndreM96

4

मैं इस उत्तर दिया गया है पता है, लेकिन मैं भी इस समस्या का एक जवाब खोजने के लिए संघर्ष किया और स्वीकार किए जाते हैं जवाब के लिए काम नहीं किया मुझे। अंत में, मैंने जो समाधान पाया वह वास्तव में बहुत आसान है और ब्राउज़र में इसका समर्थन है:

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

यही है। आसान नहीं हो सका।

+0

लक्ष्य क्या है? – scord

+0

@scord 'target' एक तत्व है जिसे आप –

+0

के लिए अपना ईवेंट प्रेषित करना चाहते हैं दुर्भाग्यवश ब्राउज़र के बीच समर्थन के वर्तमान स्तर के साथ यह सबसे वैध समाधान प्रतीत होता है, हालांकि बहुत मजबूत नहीं है। बस एक सामान्य घटना बनाएं और मैन्युअल रूप से उन सभी गुणों को भरें जिन्हें आप चाहते हैं जैसे कि यह "असली" स्पर्श ईवेंट था। –

संबंधित मुद्दे