Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function getPseudoElementSelectors() {
- var matchPseudoSelector = /:{1,2}(after|before)/,
- found = { before: [], after: [] };
- if (!(document.styleSheets && document.styleSheets.length)) return found;
- return Array.from(document.styleSheets)
- .reduce(function(pseudoSelectors, sheet) {
- try {
- if (!sheet.cssRules) return pseudoSelectors;
- // Get an array of all individual selectors.
- var ruleSelectors = Array.from(sheet.cssRules)
- .reduce(function(selectors, rule) {
- return (rule && rule.selectorText)
- ? selectors.concat(rule.selectorText.split(','))
- : selectors;
- }, []);
- // Construct a dictionary of rules with pseudo-elements.
- var rulePseudoSelectors = ruleSelectors.reduce(function(selectors, selector) {
- // Check if this selector has a pseudo-element.
- if (matchPseudoSelector.test(selector)) {
- var pseudoElement = matchPseudoSelector.exec(selector)[1],
- cleanSelector = selector.replace(matchPseudoSelector, '').trim();
- selectors[pseudoElement].push(cleanSelector);
- }
- return selectors;
- }, { before: [], after: [] });
- pseudoSelectors.before = pseudoSelectors.before.concat(rulePseudoSelectors.before);
- pseudoSelectors.after = pseudoSelectors.after.concat(rulePseudoSelectors.after);
- // Quietly handle errors from accessing cross-origin stylesheets.
- } catch (e) { if (console && console.warn) console.warn(e); }
- return pseudoSelectors;
- }, found);
- }
- function getPseudoElementsByCssSelectors() {
- var selectors = getPseudoElementSelectors(),
- names = ['before', 'after']
- return names.reduce(function(pseudoElements, name) {
- if (!selectors[name].length) return pseudoElements;
- var selector = selectors[name].join(','),
- elements = Array.from(document.querySelectorAll(selector));
- return pseudoElements.concat(
- elements.reduce(function(withContent, el) {
- var pseudo = getComputedStyle(el, name);
- // Add to array if element has content defined.
- return (pseudo.content.length)
- ? withContent.concat(pseudo)
- : withContent;
- }, [])
- );
- }, []);
- }
- Array.from = Array.from || function(arrayish) {
- return [].slice.call(arrayish);
- };
- function getPseudoElements() {
- var allElements = document.getElementsByTagName("*"),
- pseudoElements = [];
- for (var i=0, max=allElements.length; i < max; i++) {
- var before = window.getComputedStyle(allElements[i], ':before');
- var after = window.getComputedStyle(allElements[i], ':after');
- if (before.content) {
- pseudoElements.push(before);
- }
- if (after.content) {
- pseudoElements.push(after);
- }
- }
- return pseudoElements;
- }
- console.time("getPseudoElementsByCssSelectors");
- for (var i = 0; i < 1000; i++) getPseudoElementsByCssSelectors(); console.timeEnd("getPseudoElementsByCssSelectors");
- console.time("getPseudoElements");
- for (var i = 0; i < 1000; i++) getPseudoElements();
- console.timeEnd("getPseudoElements");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement