(node, respMap)
| 1868 | |
| 1869 | // read:递归提取节点文本 |
| 1870 | function parseDfs(node, respMap) { |
| 1871 | if (isEmpty(node)) return; |
| 1872 | |
| 1873 | // console.log("当前节点:", node) |
| 1874 | switch (node.nodeType) { |
| 1875 | // 1、元素节点 |
| 1876 | case Node.ELEMENT_NODE: |
| 1877 | // console.log("元素节点: ", node); |
| 1878 | // 根据 host 获取 skip 函数,判断是否需要跳过 |
| 1879 | let skipFn = skipStringMap[url.host]; |
| 1880 | if (skipFn && skipFn(node)) return; |
| 1881 | // aria 提示信息 |
| 1882 | if (node.hasAttribute("aria-label")) processNode(node, textType.ariaLabel, respMap); |
| 1883 | // 按钮与文本域节点 |
| 1884 | if (["input", "button", "textarea"].includes(node.tagName.toLowerCase())) { |
| 1885 | if (node.placeholder) processNode(node, textType.placeholder, respMap); |
| 1886 | if (node.value && (node.tagName.toLowerCase() === "button" || ["submit", "button"].includes(node.type))) processNode(node, textType.inputValue, respMap); |
| 1887 | } |
| 1888 | break; |
| 1889 | // 2、文本节点 |
| 1890 | case Node.TEXT_NODE: |
| 1891 | let fn = adapterFnMap[url.host]; // 根据 host 获取 adapter 函数,判断是否需要特殊处理 |
| 1892 | isEmpty(fn) ? processNode(node, textType.textContent, respMap) : fn(node, respMap); |
| 1893 | return; // 文本节点无子节点,return |
| 1894 | } |
| 1895 | let child = node.firstChild; |
| 1896 | while (child) { |
| 1897 | parseDfs(child, respMap); |
| 1898 | child = child.nextSibling; |
| 1899 | } |
| 1900 | } |
| 1901 | |
| 1902 | function processNode(node, attr, respMap) { |
| 1903 | let text; |
no test coverage detected