diff --git a/core/includes/common.inc b/core/includes/common.inc
index c9913a2..db4c632 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -3518,7 +3518,8 @@ function drupal_html_id($id) {
       // requested id. $_POST['ajax_html_ids'] contains the ids as they were
       // returned by this function, potentially with the appended counter, so
       // we parse that to reconstruct the $seen_ids array.
-      foreach ($_POST['ajax_html_ids'] as $seen_id) {
+      $ajax_html_ids = explode(' ', $_POST['ajax_html_ids']);
+      foreach ($ajax_html_ids as $seen_id) {
         // We rely on '--' being used solely for separating a base id from the
         // counter, which this function ensures when returning an id.
         $parts = explode('--', $seen_id, 2);
diff --git a/core/misc/ajax.js b/core/misc/ajax.js
index 94bfb89..d2573ca 100644
--- a/core/misc/ajax.js
+++ b/core/misc/ajax.js
@@ -284,10 +284,13 @@ Drupal.ajax.prototype.beforeSerialize = function (element, options) {
 
   // Prevent duplicate HTML ids in the returned markup.
   // @see drupal_html_id()
-  options.data['ajax_html_ids[]'] = [];
-  $('[id]').each(function () {
-    options.data['ajax_html_ids[]'].push(this.id);
+  var ids = document.querySelectorAll('[id]');
+  options.data['ajax_html_ids'] = [];
+  for (var i = 0, il = ids.length; i < il; i++) {
+    options.data['ajax_html_ids'].push(ids[i].id);
   });
+  // Join IDs to minimize request size.
+  options.data['ajax_html_ids'] = options.data['ajax_html_ids'].join(' ');
 
   // Allow Drupal to return new JavaScript and CSS files to load without
   // returning the ones already loaded.
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
index 10501d0..98feb67 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
@@ -1284,9 +1284,12 @@ abstract class WebTestBase extends TestBase {
         $extra_post .= '&' . urlencode($key) . '=' . urlencode($value);
       }
     }
+    $ajax_html_ids = array();
     foreach ($this->xpath('//*[@id]') as $element) {
-      $id = (string) $element['id'];
-      $extra_post .= '&' . urlencode('ajax_html_ids[]') . '=' . urlencode($id);
+      $ajax_html_ids[] = (string) $element['id'];
+    }
+    if (!empty($ajax_html_ids)) {
+      $extra_post .= '&' . urlencode('ajax_html_ids') . '=' . urlencode(implode(' ', $ajax_html_ids));
     }
     if (isset($drupal_settings['ajaxPageState'])) {
       $extra_post .= '&' . urlencode('ajax_page_state[theme]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme']);
