diff --git a/src/js/media/html5.js b/src/js/media/html5.js
index d9461c25d3..5dcbb3ab99 100644
--- a/src/js/media/html5.js
+++ b/src/js/media/html5.js
@@ -110,6 +110,10 @@ vjs.Html5.prototype.setupTriggers = function(){
// Triggers removed using this.off when disposed
vjs.Html5.prototype.eventHandler = function(e){
+ // Prevent default action from being called on the target (the video element),
+ // as all events handled here originated from it. Fixes #620.
+ e.preventDefault();
+
this.trigger(e);
// No need for media events to bubble up.
diff --git a/test/unit/media.html5.js b/test/unit/media.html5.js
index 07c6e6a31b..e0451670c7 100644
--- a/test/unit/media.html5.js
+++ b/test/unit/media.html5.js
@@ -32,4 +32,23 @@ test('should re-link the player if the tech is moved', function(){
tech.createEl();
strictEqual(player, tech.el()['player']);
+});
+
+test('should not call default action on media event', function() {
+ expect(2);
+ var player = {
+ id: function() { return 'id'; },
+ el: function() { return document.createElement('div'); },
+ options_: {},
+ trigger: function(event) {
+ ok(event.type === 'play', 'non-play media event fired');
+ ok(event.isDefaultPrevented(), 'default action not prevented');
+ },
+ ready: function() {}
+ };
+ var tech = new vjs.Html5(player, { el: vjs.TEST_VID });
+ // Mediafaker doesn't support play/pause, so dispatch an event manually.
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('play', false /*bubbles*/, true /*cancelable*/, null);
+ tech.el_.dispatchEvent(event);
});
\ No newline at end of file