diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 568dc130..dff9e5b8 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -23,8 +23,19 @@ var DomEvent = /** @lends DomEvent */{ for (var type in events) { var func = events[type], parts = type.split(/[\s,]+/g); - for (var i = 0, l = parts.length; i < l; i++) - el.addEventListener(parts[i], func, false); + for (var i = 0, l = parts.length; i < l; i++) { + var name = parts[i]; + // For touchstart/touchmove events on document, we need to + // explicitely declare that event is not passive (can be + // prevented). Otherwise chrome browser would ignore + // event.preventDefault() calls. See #1501 and + // https://www.chromestatus.com/features/5093566007214080 + var options = ( + el === document + && (name === 'touchstart' || name === 'touchmove') + ) ? { passive: false } : false; + el.addEventListener(name, func, options); + } } } }, diff --git a/src/view/View.js b/src/view/View.js index 39e896da..e7edb3eb 100644 --- a/src/view/View.js +++ b/src/view/View.js @@ -1440,8 +1440,16 @@ new function() { // Injection scope for event handling on the browser // which can call `preventDefault()` explicitly or return `false`. // - If this is a unhandled mousedown event, but the view or tools // respond to mouseup. - if (called && !mouse.move || mouse.down && responds('mouseup')) + // + // Some events are not cancelable anyway (like during a scroll + // inertia on mobile) so trying to prevent default in those case + // would result in no effect and an error. + if ( + event.cancelable !== false + && (called && !mouse.move || mouse.down && responds('mouseup')) + ) { event.preventDefault(); + } }, /**