diff --git a/reviewboard/static/rb/css/pages/diffviewer.less b/reviewboard/static/rb/css/pages/diffviewer.less
index 8e64c07d733062f2047bca04e6beb0107584b479..0d8e1f807cac7d515b3577cba1f0612372544767 100644
--- a/reviewboard/static/rb/css/pages/diffviewer.less
+++ b/reviewboard/static/rb/css/pages/diffviewer.less
@@ -941,6 +941,15 @@
     top: -9px;
     z-index: 2;
     cursor: grab;
+
+    /*
+    * Disable touch input for touchscreen devices only.
+    * This is done to solve the issue of viewport being dragged
+    * when the handle bar is dragged.
+    */
+    @media (hover: none) and (pointer: coarse) {
+        touch-action: none;
+    }
   }
 
   .revision-selector-range {
diff --git a/reviewboard/static/rb/js/views/revisionSelectorView.es6.js b/reviewboard/static/rb/js/views/revisionSelectorView.es6.js
index 8dc0c198eee7341fc77858745569fa5f3b9ec3c9..8b5499cce6280df32e9dd0469d89585b7dac12a0 100644
--- a/reviewboard/static/rb/js/views/revisionSelectorView.es6.js
+++ b/reviewboard/static/rb/js/views/revisionSelectorView.es6.js
@@ -14,8 +14,8 @@ RB.RevisionSelectorView = Backbone.View.extend({
     `),
 
     events: {
-        'mousedown .revision-selector-handle': '_onHandleMouseDown',
-        'mousedown .revision-selector-label': '_onLabelMouseDown',
+        'pointerdown .revision-selector-handle': '_onHandlePointerDown',
+        'pointerdown .revision-selector-label': '_onLabelPointerDown',
         'click .revision-selector-label': '_onLabelClick',
     },
 
@@ -40,7 +40,7 @@ RB.RevisionSelectorView = Backbone.View.extend({
 
         this._activeHandle = null;
         this._firstLabelActive = options.firstLabelActive;
-        this._mouseActive = false;
+        this._pointerActive = false;
         this._numHandles = options.numHandles;
         this._values = [];
 
@@ -48,7 +48,7 @@ RB.RevisionSelectorView = Backbone.View.extend({
 
         this.listenTo(this.model, 'change', this._update);
 
-        _.bindAll(this, '_onHandleMouseUp', '_onHandleMouseMove');
+        _.bindAll(this, '_onHandlePointerUp', '_onHandlePointerMove');
     },
 
     /**
@@ -123,8 +123,8 @@ RB.RevisionSelectorView = Backbone.View.extend({
      */
     _updateHandles() {
         const positions = this._positions;
-        const values = this._mouseActive ? this._activeValues
-                                         : this._values;
+        const values = this._pointerActive ? this._activeValues
+                                           : this._values;
 
         this._$handles.children().each((i, el) => {
             $(el).css('left', (positions[values[i]] - 4) + 'px');
@@ -146,9 +146,9 @@ RB.RevisionSelectorView = Backbone.View.extend({
      *
      * Args:
      *     ev (Event):
-     *         The mousedown event.
+     *         The pointerdown event.
      */
-    _onHandleMouseDown(ev) {
+    _onHandlePointerDown(ev) {
         ev.preventDefault();
         ev.stopPropagation();
 
@@ -158,36 +158,36 @@ RB.RevisionSelectorView = Backbone.View.extend({
             this._activeValues.push(i);
         }
 
-        this._mouseActive = true;
+        this._pointerActive = true;
         this._activeHandle = $(ev.currentTarget).data('handle-id');
 
-        document.addEventListener('mouseup', this._onHandleMouseUp, true);
-        document.addEventListener('mousemove', this._onHandleMouseMove, true);
+        document.addEventListener('pointerup', this._onHandlePointerUp, true);
+        document.addEventListener('pointermove', this._onHandlePointerMove, true);
 
         $('body').addClass('revision-selector-grabbed');
     },
 
     /**
-     * Callback for when a mouseup event occurs anywhere.
+     * Callback for when a pointerup event occurs anywhere.
      *
      * Triggers the 'revisionSelected' event with the new revisions.
      * Removes event handlers used during the drag operation.
      *
      * Args:
      *     ev (Event):
-     *         The mouseup event.
+     *         The pointerup event.
      */
-    _onHandleMouseUp(ev) {
-        console.assert(this._mouseActive);
+    _onHandlePointerUp(ev) {
+        console.assert(this._pointerActive);
 
         ev.stopPropagation();
         ev.preventDefault();
 
-        this._mouseActive = false;
+        this._pointerActive = false;
         this._activeHandle = null;
 
-        document.removeEventListener('mouseup', this._onHandleMouseUp, true);
-        document.removeEventListener('mousemove', this._onHandleMouseMove, true);
+        document.removeEventListener('pointerup', this._onHandlePointerUp, true);
+        document.removeEventListener('pointermove', this._onHandlePointerMove, true);
 
         $('body').removeClass('revision-selector-grabbed');
 
@@ -197,25 +197,25 @@ RB.RevisionSelectorView = Backbone.View.extend({
     },
 
     /**
-     * Callback for a mousemove event anywhere.
+     * Callback for a pointermove event anywhere.
      *
      * Updates the "active" values to select the revisions closest to the
-     * current location of the mouse.
+     * current location of the pointer.
      *
      * Args:
      *     ev (Event):
-     *         The mousemove event.
+     *         The pointermove event.
      */
-    _onHandleMouseMove(ev) {
-        console.assert(this._mouseActive);
+    _onHandlePointerMove(ev) {
+        console.assert(this._pointerActive);
 
-        const mouseX = (window.pageXOffset + ev.clientX -
-                        this._$trough.offset().left);
+        const pointerX = (window.pageXOffset + ev.clientX -
+                          this._$trough.offset().left);
         let closestPos;
         let closestDist;
 
         for (let i = 0; i < this._positions.length; i++) {
-            const dist = Math.abs(this._positions[i] - mouseX);
+            const dist = Math.abs(this._positions[i] - pointerX);
 
             if (closestDist === undefined || dist < closestDist) {
                 closestDist = dist;
