manually trigger touch event

events, javascript, touch

Solution

According to W3C

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

Then, also change

e.initMouseEvent();

to

e.initTouchEvent();

As you've created a `touchstart` event.

The W3C link says:

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.

So you'll might have to resort to `e.initUIEvent('touchstart', true, true);` In addition, the official spec also states that the `TouchList` object is optional, and can be created manually using the `createTouchList` method. To add a touch to that list, you'll have to call the `createTouch` method, where you'll pass all coordinates and such:

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

If that doesn't work, you could try this:

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

should work, it makes more sense than `createEvent('MouseEvent')` at any rate... But for testing purposes, why not open your chrome console and check `Emulate touch events`, plus override user agent to Android 4. (Ctrl+Shift+j > click the gear bottom right corner, and select Overrides, there you'll find all the settings you need)

Since the touch-events have a long way to go, still in terms of their becoming standardized, it turns out the `touches` property is not RO (yet?), so you can use this quick-fix (which the OP found and used with the desired result):

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

Which, I think (I can't believe it if it weren't the case) is faster than:

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

Problem

I searched for the past 30 minutes, but didn't find a solution. I want to trigger a `touchstart` event on an element. This fires the `touchstart` event: ``` 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); ``` Note that the variables are defined by my function But there's a problem with that. The `event` object doesn't have a `touches` property. So something like this won't work: ``` var touch = e.touches[0]; ``` Is there a way to trigger a `touchstart` event manually (it should work on Android >= 4.0 and Chrome with touch enabled [DevTools]) ? Please note, that I do NOT want to use any framework like jQuery. With jQuery it's easy to create a `touchevent` on an element ;)

Original source