diff -u b/core/misc/date.es6.js b/core/misc/date.es6.js
--- b/core/misc/date.es6.js
+++ b/core/misc/date.es6.js
@@ -18,60 +18,49 @@
       // If the browser does not support a native datepicker, add date
       // formatting instructions on date/time fields.
       if (Modernizr.inputtypes.date === false) {
-        Array.prototype.forEach.call(
-          once(
-            document.querySelectorAll(
-              '[data-drupal-field-elements="date-time"]',
-            ),
-            'datepicker',
-          ),
-          dateTime => {
-            const dateInput = dateTime.querySelector('input[type="date"]');
-            const timeInput = dateTime.querySelector('input[type="time"]');
-            const help = Drupal.theme.dateTimeHelp({
-              dateId: `${dateInput.id}--description`,
-              dateDesc: dateInput.dataset.help,
-              timeId: `${timeInput.id}--description`,
-              timeDesc: timeInput.dataset.help,
-            });
+        once(
+          'datepicker',
+          document.querySelectorAll('[data-drupal-field-elements="date-time"]'),
+        ).forEach(dateTime => {
+          const dateInput = dateTime.querySelector('input[type="date"]');
+          const timeInput = dateTime.querySelector('input[type="time"]');
+          const help = Drupal.theme.dateTimeHelp({
+            dateId: `${dateInput.id}--description`,
+            dateDesc: dateInput.dataset.help,
+            timeId: `${timeInput.id}--description`,
+            timeDesc: timeInput.dataset.help,
+          });
 
-            [dateInput, timeInput].forEach(input => {
-              input.setAttribute(
-                'aria-describedby',
-                `${input.id}--description`,
-              );
-              // If the browser does not support date or time inputs, the input
-              // is treated as the type "text". The type attribute should be
-              // changed to reflect this.
-              input.setAttribute('type', 'text');
-            });
+          [dateInput, timeInput].forEach(input => {
+            input.setAttribute('aria-describedby', `${input.id}--description`);
+            // If the browser does not support date or time inputs, the input
+            // is treated as the type "text". The type attribute should be
+            // changed to reflect this.
+            input.setAttribute('type', 'text');
+          });
 
-            Drupal.DatepickerPolyfill.attachDescription(dateTime, help);
-          },
-        );
+          Drupal.DatepickerPolyfill.attachDescription(dateTime, help);
+        });
 
-        Array.prototype.forEach.call(
-          once(
-            document.querySelectorAll('[data-drupal-field-elements="date"]'),
-            'datepicker',
-          ),
-          date => {
-            const dateInput = date.querySelector('input[type="date"]');
-            const help = Drupal.theme.dateHelp({
-              dateDesc: dateInput.dataset.help,
-            });
+        once(
+          'datepicker',
+          document.querySelectorAll('[data-drupal-field-elements="date"]'),
+        ).forEach(date => {
+          const dateInput = date.querySelector('input[type="date"]');
+          const help = Drupal.theme.dateHelp({
+            dateDesc: dateInput.dataset.help,
+          });
 
-            // Date-only input will be described by description directly.
-            const id = `${date.id}--description`;
-            dateInput.setAttribute('aria-describedby', id);
+          // Date-only input will be described by description directly.
+          const id = `${date.id}--description`;
+          dateInput.setAttribute('aria-describedby', id);
 
-            // If the browser does not support date inputs, the input is treated
-            // as the type "text". The type attribute should be changed to
-            // changed to reflect this.
-            dateInput.setAttribute('type', 'text');
-            Drupal.DatepickerPolyfill.attachDescription(date, help, id);
-          },
-        );
+          // If the browser does not support date inputs, the input is treated
+          // as the type "text". The type attribute should be changed to
+          // changed to reflect this.
+          dateInput.setAttribute('type', 'text');
+          Drupal.DatepickerPolyfill.attachDescription(date, help, id);
+        });
       }
     },
   };
diff -u b/core/misc/date.js b/core/misc/date.js
--- b/core/misc/date.js
+++ b/core/misc/date.js
@@ -15,7 +15,7 @@
   Drupal.behaviors.date = {
     attach: function attach(context, settings) {
       if (Modernizr.inputtypes.date === false) {
-        Array.prototype.forEach.call(once(document.querySelectorAll('[data-drupal-field-elements="date-time"]'), 'datepicker'), function (dateTime) {
+        once('datepicker', document.querySelectorAll('[data-drupal-field-elements="date-time"]')).forEach(function (dateTime) {
           var dateInput = dateTime.querySelector('input[type="date"]');
           var timeInput = dateTime.querySelector('input[type="time"]');
           var help = Drupal.theme.dateTimeHelp({
@@ -30,7 +30,7 @@
           });
           Drupal.DatepickerPolyfill.attachDescription(dateTime, help);
         });
-        Array.prototype.forEach.call(once(document.querySelectorAll('[data-drupal-field-elements="date"]'), 'datepicker'), function (date) {
+        once('datepicker', document.querySelectorAll('[data-drupal-field-elements="date"]')).forEach(function (date) {
           var dateInput = date.querySelector('input[type="date"]');
           var help = Drupal.theme.dateHelp({
             dateDesc: dateInput.dataset.help
diff -u b/core/misc/once/once.es6.js b/core/misc/once/once.es6.js
--- b/core/misc/once/once.es6.js
+++ b/core/misc/once/once.es6.js
@@ -134,20 +134,20 @@
    *
    * @example
    * const elements = once(
-   *   document.querySelectorAll('[data-myelement]'),
    *   'my-once-id',
+   *   document.querySelectorAll('[data-myelement]'),
    * );
    *
-   * @param  {NodeList|Array.<Element>} elements
-   *   A NodeList or array of elements.
    * @param  {string} id
    *   The id of the once call.
+   * @param  {NodeList|Array.<Element>} elements
+   *   A NodeList or array of elements.
    *
    * @return {Array.<Element>}
    *   An array of elements that have not yet been processed by a once call
    *   with a given id.
    */
-  function once(elements, id) {
+  function once(id, elements) {
     const dataId = checkId(id);
     return filterAndModify(
       elements,
@@ -174,20 +174,20 @@
    *
    * @example
    * const removedOnceElements = once.remove(
-   *   document.querySelectorAll('[data-myelement]'),
    *   'my-once-id',
+   *   document.querySelectorAll('[data-myelement]'),
    * );
    *
-   * @param  {NodeList|Array.<Element>} elements
-   *   A NodeList or array of elements to remove the once id from.
    * @param  {string} id
    *   The id of a once call.
+   * @param  {NodeList|Array.<Element>} elements
+   *   A NodeList or array of elements to remove the once id from.
    *
    * @return {Array.<Element>}
    *   A filtered array of elements that had been processed by the provided id,
    *   and are now able to be processed again.
    */
-  once.remove = (elements, id) => {
+  once.remove = (id, elements) => {
     const dataId = checkId(id);
     return filterAndModify(elements, `[${attrName}~="${dataId}"]`, element => {
       element.setAttribute(
@@ -207,23 +207,52 @@
    * processed by the provided once id.
    *
    * @example
-   * const filteredElements = once.find(
-   *   document.querySelectorAll('[data-myelement]'),
+   * const filteredElements = once.filter(
    *   'my-once-id',
+   *   document.querySelectorAll('[data-myelement]'),
    * );
    *
+   * @param  {string} id
+   *   The id of the once call.
    * @param  {NodeList|Array.<Element>} elements
    *   A NodeList or array of elements to be searched.
+   *
+   * @return {Array.<Element>}
+   *   A filtered array of elements that have already been processed by the
+   *   provided once id.
+   */
+  once.filter = (id, elements) => {
+    const dataId = checkId(id);
+    return filterAndModify(elements, `[${attrName}~="${dataId}"]`);
+  };
+
+  /**
+   * Finds elements that have been processed by a given once id.
+   *
+   * Query the 'context' element for elements that already have the
+   * corresponding once id value.
+   *
+   * @example
+   * const oncedElements = once.find('my-once-id');
+   *
    * @param  {string} id
    *   The id of the once call.
+   * @param  {Element} [context]
+   *   Scope of the search for matching elements.
    *
    * @return {Array.<Element>}
    *   A filtered array of elements that have already been processed by the
    *   provided once id.
    */
-  once.find = (elements, id) => {
+  once.find = (id, context = document.documentElement) => {
     const dataId = checkId(id);
-    return filterAndModify(elements, `[${attrName}~="${dataId}"]`);
+    return (
+      checkElement(context) &&
+      // Ensure the return is an Array and not a NodeList.
+      Array.prototype.slice.call(
+        context.querySelectorAll(`[${attrName}~="${dataId}"]`),
+      )
+    );
   };
 
   window.once = once;
diff -u b/core/misc/once/once.jquery.es6.js b/core/misc/once/once.jquery.es6.js
--- b/core/misc/once/once.jquery.es6.js
+++ b/core/misc/once/once.jquery.es6.js
@@ -25,12 +25,12 @@
       elements.length === 1 &&
       (elements[0] === window || elements[0] === document)
     ) {
-      const result = method([document.documentElement], id);
+      const result = method(id, [document.documentElement]);
       // Return the original argument to keep jQuery chaining working as
       // expected.
       return result.length ? elements : [];
     }
-    return method(elements, id);
+    return method(id, elements);
   }
 
   /**
@@ -61,7 +61,7 @@
    * @see once.find
    */
   $.fn.findOnce = function jqueryFindOnce(id) {
-    return $(alias(this, id, once.find));
+    return $(alias(this, id, once.filter));
   };
   /**
    * Removes the once data from elements based on the given ID.
diff -u b/core/misc/once/once.jquery.js b/core/misc/once/once.jquery.js
--- b/core/misc/once/once.jquery.js
+++ b/core/misc/once/once.jquery.js
@@ -8,11 +8,11 @@
 (function ($, once) {
   function alias(elements, id, method) {
     if (elements.length === 1 && (elements[0] === window || elements[0] === document)) {
-      var result = method([document.documentElement], id);
+      var result = method(id, [document.documentElement]);
       return result.length ? elements : [];
     }
 
-    return method(elements, id);
+    return method(id, elements);
   }
 
   $.fn.once = function jqueryOnce(id) {
@@ -20,7 +20,7 @@
   };
 
   $.fn.findOnce = function jqueryFindOnce(id) {
-    return $(alias(this, id, once.find));
+    return $(alias(this, id, once.filter));
   };
 
   $.fn.removeOnce = function jqueryRemoveOnce(id) {
diff -u b/core/misc/once/once.js b/core/misc/once/once.js
--- b/core/misc/once/once.js
+++ b/core/misc/once/once.js
@@ -59,7 +59,7 @@
     return result.join(' ');
   }
 
-  function once(elements, id) {
+  function once(id, elements) {
     var dataId = checkId(id);
     return filterAndModify(elements, ":not([".concat(attrName, "~=\"").concat(dataId, "\"])"), function (element) {
       var value = dataId;
@@ -75,7 +75,7 @@
     });
   }
 
-  once.remove = function (elements, id) {
+  once.remove = function (id, elements) {
     var dataId = checkId(id);
     return filterAndModify(elements, "[".concat(attrName, "~=\"").concat(dataId, "\"]"), function (element) {
       element.setAttribute(attrName, updateAttribute({
@@ -86,9 +86,15 @@
   };
 
-  once.find = function (elements, id) {
+  once.filter = function (id, elements) {
     var dataId = checkId(id);
     return filterAndModify(elements, "[".concat(attrName, "~=\"").concat(dataId, "\"]"));
   };
 
+  once.find = function (id) {
+    var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.documentElement;
+    var dataId = checkId(id);
+    return checkElement(context) && Array.prototype.slice.call(context.querySelectorAll("[".concat(attrName, "~=\"").concat(dataId, "\"]")));
+  };
+
   window.once = once;
 })();
\ Pas de fin de ligne à la fin du fichier
diff -u b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.es6.js b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.es6.js
--- b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.es6.js
+++ b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.es6.js
@@ -11,7 +11,7 @@
       const addedOften = document.createElement('div');
       addedOften.classList.add('added-often');
       addedOften.textContent = `Added often! ${Date.now()}`;
-      once(document.querySelectorAll('#added-once'), 'use-once').forEach(el => {
+      once('use-once', document.querySelectorAll('#added-once')).forEach(el => {
         el.appendChild(addedOnce);
       });
       document.getElementById('added-often').appendChild(addedOften);
diff -u b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.js b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.js
--- b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.js
+++ b/core/modules/system/tests/modules/once_test/js/vanilla-once-test.js
@@ -14,7 +14,7 @@
       var addedOften = document.createElement('div');
       addedOften.classList.add('added-often');
       addedOften.textContent = "Added often! ".concat(Date.now());
-      once(document.querySelectorAll('#added-once'), 'use-once').forEach(function (el) {
+      once('use-once', document.querySelectorAll('#added-once')).forEach(function (el) {
         el.appendChild(addedOnce);
       });
       document.getElementById('added-often').appendChild(addedOften);
