diff --git a/djblets/static/djblets/js/jquery.gravy.inlineEditor.js b/djblets/static/djblets/js/jquery.gravy.inlineEditor.js
index 8c44f41c8fee23dc6f8dfa712ae22af2eac24165..ab0a8fe3fbb00104de04593b8f56350698be5cbc 100644
--- a/djblets/static/djblets/js/jquery.gravy.inlineEditor.js
+++ b/djblets/static/djblets/js/jquery.gravy.inlineEditor.js
@@ -56,12 +56,13 @@ $.widget("ui.inlineEditor", {
             return editor._field.val();
         },
         isFieldDirty: function(editor, initialValue) {
-            var value = editor.options.getFieldValue(editor),
+            var value = editor.options.getFieldValue(editor) || '',
                 normValue = (editor.options.hasRawValue
                              ? value
-                             : value.htmlEncode());
+                             : value.htmlEncode()) || '';
 
-            return normValue !== initialValue;
+            return normValue.length !== initialValue.length ||
+                   normValue !== initialValue;
         }
     },
 
@@ -278,6 +279,7 @@ $.widget("ui.inlineEditor", {
             })
             .keyup(function() {
                 self._updateDirtyState();
+                return false;
             });
     },
 
@@ -539,7 +541,11 @@ $.widget("ui.inlineEditor", {
         return this._dirty;
     },
 
-    _updateDirtyState: function() {
+    _updateDirtyState: _.throttle(function() {
+        _.defer(this._updateDirtyStateInternal);
+    }, 200),
+
+    _updateDirtyStateInternal: function() {
         var curDirtyState = (this._editing &&
                              this.options.isFieldDirty(
                                 this,
