diff --git a/modules/big_pipe/js/big_pipe.js b/modules/big_pipe/js/big_pipe.js
index d20331de05..32700f7ed3 100644
--- a/modules/big_pipe/js/big_pipe.js
+++ b/modules/big_pipe/js/big_pipe.js
@@ -69,20 +69,30 @@
       return;
     }
 
-    // Immediately remove the replacement to prevent it being processed twice.
-    delete drupalSettings.bigPipePlaceholderIds[id];
-
     const response = mapTextContentToAjaxResponse(content);
 
     if (response === false) {
       return;
     }
 
+    // Immediately remove the replacement to prevent it being processed twice.
+    delete drupalSettings.bigPipePlaceholderIds[id];
+
     // Then, simulate an AJAX response having arrived, and let the Ajax system
     // handle it.
     ajaxObject.success(response, 'success');
   }
 
+  /**
+   * Checks if node is valid big pipe replacement.
+   */
+  function checkMutation(node) {
+    return Boolean(node.nodeType === Node.ELEMENT_NODE &&
+      node.nodeName === 'SCRIPT' &&
+      node.dataset &&
+      node.dataset.bigPipeReplacementForPlaceholderWithId);
+  }
+
   /**
    * Check that the element is valid to process and process it.
    *
@@ -90,12 +100,7 @@
    *  The node added to the body element.
    */
   function checkMutationAndProcess(node) {
-    if (
-      node.nodeType === Node.ELEMENT_NODE &&
-      node.nodeName === 'SCRIPT' &&
-      node.dataset &&
-      node.dataset.bigPipeReplacementForPlaceholderWithId
-    ) {
+    if (checkMutation(node)) {
       processReplacement(node);
     }
   }
@@ -107,8 +112,16 @@
    *  The list of mutations registered by the browser.
    */
   function processMutations(mutations) {
-    mutations.forEach(({ addedNodes }) => {
+    mutations.forEach(({ addedNodes, type, target }) => {
       addedNodes.forEach(checkMutationAndProcess);
+
+      if (
+        type === 'characterData'
+        && checkMutation(target.parentNode)
+        && drupalSettings.bigPipePlaceholderIds[target.parentNode.dataset.bigPipeReplacementForPlaceholderWithId] === true
+      ) {
+        processReplacement(target.parentNode);
+      }
     });
   }
 
@@ -122,7 +135,7 @@
   document.querySelectorAll(replacementsSelector).forEach(processReplacement);
 
   // Start observing the body element for new children.
-  observer.observe(document.body, { childList: true });
+  observer.observe(document.body, { childList: true, subtree: true, characterData: true });
 
   // As soon as the document is loaded, no more replacements will be added.
   // Immediately fetch and process all pending mutations and stop the observer.
