diff --git a/app/assets/javascripts/mr_notes/init_notes.js b/app/assets/javascripts/mr_notes/init_notes.js
index 8caac68e0d4883f01dde775f11f4a806ccd4d8ab..622db360d1f8168d99c8bddd3041be49d1b1cf33 100644
--- a/app/assets/javascripts/mr_notes/init_notes.js
+++ b/app/assets/javascripts/mr_notes/init_notes.js
@@ -59,6 +59,10 @@ export default () => {
     render(createElement) {
       const isDiffView = this.activeTab === 'diffs';
 
+      // NOTE: Even though `discussionKeyboardNavigator` is added to the `notes-app`,
+      // it adds a global key listener so it works on the diffs tab as well.
+      // If we create a single Vue app for all of the MR tabs, we should move this
+      // up the tree, to the root.
       return createElement(discussionKeyboardNavigator, { props: { isDiffView } }, [
         createElement('notes-app', {
           props: {
diff --git a/app/assets/javascripts/notes/components/discussion_keyboard_navigator.vue b/app/assets/javascripts/notes/components/discussion_keyboard_navigator.vue
index 5fc2b6ba04c0ebf37d895fa521900a4667a64766..7fbfe8eebb24fef781fe29116cf6f46d0c0bc02b 100644
--- a/app/assets/javascripts/notes/components/discussion_keyboard_navigator.vue
+++ b/app/assets/javascripts/notes/components/discussion_keyboard_navigator.vue
@@ -25,6 +25,10 @@ export default {
     Mousetrap.bind('n', () => this.jumpToNextDiscussion());
     Mousetrap.bind('p', () => this.jumpToPreviousDiscussion());
   },
+  beforeDestroy() {
+    Mousetrap.unbind('n');
+    Mousetrap.unbind('p');
+  },
   methods: {
     ...mapActions(['expandDiscussion']),
     jumpToNextDiscussion() {
diff --git a/spec/frontend/notes/components/discussion_keyboard_navigator_spec.js b/spec/frontend/notes/components/discussion_keyboard_navigator_spec.js
index 6d50713999ddc05ada7ae57fe7d1adaee3b20e43..8881bedf3cc9da8399c82d46718986d7b7f9d102 100644
--- a/spec/frontend/notes/components/discussion_keyboard_navigator_spec.js
+++ b/spec/frontend/notes/components/discussion_keyboard_navigator_spec.js
@@ -74,4 +74,31 @@ describe('notes/components/discussion_keyboard_navigator', () => {
       expect(wrapper.vm.currentDiscussionId).toEqual(expectedPrevId);
     });
   });
+
+  describe('on destroy', () => {
+    beforeEach(() => {
+      jest.spyOn(Mousetrap, 'unbind');
+
+      createComponent();
+
+      wrapper.destroy();
+    });
+
+    it('unbinds keys', () => {
+      expect(Mousetrap.unbind).toHaveBeenCalledWith('n');
+      expect(Mousetrap.unbind).toHaveBeenCalledWith('p');
+    });
+
+    it('does not call jumpToNextDiscussion when pressing `n`', () => {
+      Mousetrap.trigger('n');
+
+      expect(wrapper.vm.jumpToDiscussion).not.toHaveBeenCalled();
+    });
+
+    it('does not call jumpToNextDiscussion when pressing `p`', () => {
+      Mousetrap.trigger('p');
+
+      expect(wrapper.vm.jumpToDiscussion).not.toHaveBeenCalled();
+    });
+  });
 });