utils.js: Optimize performance of getCSSPath()

This commit is contained in:
Johannes Meyer 2022-07-26 13:55:20 +02:00
parent 3c2c79b669
commit 22cb1f2143

View File

@ -371,15 +371,19 @@
var path = []; var path = [];
while (true) { while (true) {
var id = element.getAttribute("id"); let id = element.id;
if (typeof id !== 'undefined' && typeof id !== 'string') {
// Sometimes there may be a form element with the name "id"
id = element.getAttribute("id");
}
// Only use ids if they're truly unique if (!! id) {
// TODO: The check used to use document.querySelectorAll, but this resulted in many issues with ids // Only use ids if they're truly unique
// that start with a decimal. jQuery seems to escape those correctly, so this is the only reason let results = document.querySelectorAll('* #' + this.escapeCSSSelector(id));
// why it's still.. jQuery. if (results.length === 1) {
if (!! id && $('* #' + id).length === 1) { path.push('#' + id);
path.push('#' + id); break;
break; }
} }
var tagName = element.tagName; var tagName = element.tagName;
@ -409,6 +413,20 @@
return path.reverse().join(' > '); return path.reverse().join(' > ');
}, },
/**
* Escape the given string to be used in a CSS selector
*
* @param {string} selector
* @returns {string}
*/
escapeCSSSelector: function (selector) {
if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {
return CSS.escape(selector);
}
return selector.replaceAll(/^(\d)/, '\\\\3$1 ');
},
/** /**
* Climbs up the given dom path and returns the element * Climbs up the given dom path and returns the element
* *