MCPcopy Index your code
hub / github.com/hoothin/UserScripts / geneSelector

Function geneSelector

Pagetual/pagetual.user.js:4643–4717  ·  view source on GitHub ↗
(ele, addID, exact)

Source from the content-addressed store, hash-verified

4641 }
4642
4643 function geneSelector(ele, addID, exact) {
4644 let selector = ele.nodeName.toLowerCase();
4645 //Google id class都是隨機。百度更過分,style script順序都是隨機的
4646 if (selector !== "html" && selector !== "body") {
4647 let hasId = false;
4648 if (addID && ele.id && /^[a-z_][\w\-_]*$/i.test(ele.id)) {
4649 if (ele.ownerDocument && ele.ownerDocument.querySelectorAll("#" + ele.id).length === 1) {
4650 hasId = true;
4651 selector = '#' + ele.id;
4652 }
4653 }
4654 if (!hasId) {
4655 let className = "";
4656 if (ele.className) {
4657 let classList = ele.classList;
4658 for (let i = 0; i < classList.length; i++) {
4659 let c = classList[i];
4660 if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) {
4661 className += '.' + c;
4662 }
4663 }
4664 selector += className;
4665 }
4666 let parent = ele.parentElement;
4667 if (parent) {
4668 if (exact) {
4669 let i, nth = 0, all = 0;
4670 for (i = 0; i < parent.children.length; i++) {
4671 if (parent.children[i].nodeName === ele.nodeName) {
4672 all++;
4673 if (parent.children[i] === ele) {
4674 nth = all;
4675 }
4676 if (nth > 0 && all > 1) {
4677 break;
4678 }
4679 }
4680 }
4681 selector += (all === 1 ? "" : `:nth-of-type(${nth})`);
4682 } else if (!className && !hasId && parent.children.length > 1 && !compareNodeName(parent, ["html"])) {
4683 let prevE = ele.previousElementSibling;
4684 if (prevE && prevE.className) {
4685 let classList = prevE.classList;
4686 for (let i = 0; i < classList.length; i++) {
4687 let c = classList[i];
4688 if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) {
4689 className += '.' + c;
4690 }
4691 }
4692 if (className) {
4693 selector = prevE.nodeName.toLowerCase() + className + "+" + selector;
4694 }
4695 }
4696 if (!className) {
4697 let i, nth = 0, all = 0;
4698 for (i = 0; i < parent.children.length; i++) {
4699 if (parent.children[i].nodeName === ele.nodeName) {
4700 all++;

Callers 3

checkElementMethod · 0.85
getSelectorFromEleMethod · 0.85
cloneStatusFunction · 0.85

Calls 1

compareNodeNameFunction · 0.85

Tested by

no test coverage detected