From 6b92321f6a04f07e0a3531d0e546c3cc20867bdb Mon Sep 17 00:00:00 2001
From: Johann-S <johann.servoire@gmail.com>
Date: Tue, 7 Aug 2018 18:37:46 +0200
Subject: [PATCH] fix(util): use getElementById when it's possible

---
 js/src/util.js        | 12 ++++++++++--
 js/tests/unit/util.js | 12 ++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/js/src/util.js b/js/src/util.js
index eb98d449c8..3008c22785 100644
--- a/js/src/util.js
+++ b/js/src/util.js
@@ -77,12 +77,20 @@ const Util = (($) => {
 
     getSelectorFromElement(element) {
       let selector = element.getAttribute('data-target')
+      let method = 'querySelector'
+
       if (!selector || selector === '#') {
-        selector = element.getAttribute('href') || ''
+        selector = (element.getAttribute('href') || '').trim()
+      }
+
+      const validSelector = selector
+      if (selector.charAt(0) === '#') {
+        selector = selector.substr(1)
+        method = 'getElementById'
       }
 
       try {
-        return document.querySelector(selector) ? selector : null
+        return document[method](selector) ? validSelector : null
       } catch (err) {
         return null
       }
diff --git a/js/tests/unit/util.js b/js/tests/unit/util.js
index 37327b8681..49252701a5 100644
--- a/js/tests/unit/util.js
+++ b/js/tests/unit/util.js
@@ -20,6 +20,18 @@ $(function () {
     assert.strictEqual(Util.getSelectorFromElement($el2[0]), null)
   })
 
+  QUnit.test('Util.getSelectorFromElement should use getElementById', function (assert) {
+    assert.expect(2)
+
+    var spy = sinon.spy(document, 'getElementById')
+
+    var $el = $('<div data-target="#7"></div>').appendTo($('#qunit-fixture'))
+    $('<div id="7" />').appendTo($('#qunit-fixture'))
+
+    assert.strictEqual(Util.getSelectorFromElement($el[0]), '#7')
+    assert.ok(spy.called)
+  })
+
   QUnit.test('Util.typeCheckConfig should thrown an error when a bad config is passed', function (assert) {
     assert.expect(1)
     var namePlugin = 'collapse'
-- 
GitLab