JS需求:忽略MSO条件注释内的重复alias检测报错
解决方案
核心思路是给原有检测逻辑增加节点是否处于mso条件注释块内的判断,对这类节点跳过重复alias检查。
步骤说明
- 新增辅助函数:
isInMsoConditionalComment用于检查当前<a>节点是否被<!--[if mso]>...<![endif]-->包裹:- 遍历节点的父元素,检查当前节点的前后兄弟节点中是否存在匹配的mso条件注释起始/结束标记
- 向上递归父元素,支持处理嵌套结构的情况
- 修改原有检测函数:
- 在重复检查逻辑前,先调用辅助函数判断节点是否在mso注释内
- 如果是mso注释内的节点,直接跳过重复检查,也不将其alias加入全局去重集合
- 非mso注释内的节点,保持原有检测逻辑不变
修改后的完整代码
// 辅助函数:判断节点是否处于mso条件注释块内 const isInMsoConditionalComment = (node) => { let currentParent = node.parentNode; while (currentParent) { const siblingNodes = Array.from(currentParent.childNodes); const nodePosition = siblingNodes.indexOf(node); // 向前查找mso条件注释起始标记 let foundStart = false; for (let i = nodePosition - 1; i >= 0; i--) { const sibling = siblingNodes[i]; if (sibling.nodeType === Node.COMMENT_NODE) { const commentContent = sibling.textContent.trim(); if (commentContent === '[if mso]>') { foundStart = true; break; } } } // 向后查找mso条件注释结束标记 let foundEnd = false; for (let i = nodePosition + 1; i < siblingNodes.length; i++) { const sibling = siblingNodes[i]; if (sibling.nodeType === Node.COMMENT_NODE) { const commentContent = sibling.textContent.trim(); if (commentContent === '<![endif]') { foundEnd = true; break; } } } if (foundStart && foundEnd) { return true; } currentParent = currentParent.parentNode; } return false; }; const checkAliasInNode = (node) => { const alias = node.getAttribute("alias"); const href = node.getAttribute("href"); if (href === null) { console.error("Href attribute is null or undefined for the following node:", node); return; } if (alias === null || alias.trim() === "") { missingAliases.push(`<span style="color: red;">Missing alias for link with href = "${href}" </span>`); return; } if (!/^[a-zA-Z0-9_]+$/.test(alias) || alias.endsWith("-")) { invalidAliases.push(`<span style="color: #FF641C;">Invalid alias "${alias}" for link with href = "${href}" </span>`); return; } // 跳过mso条件注释内的节点重复检查 if (isInMsoConditionalComment(node)) { return; } if (aliases.has(alias)) { duplicateAliases.push(`<span style="color: #FF641C;">Duplicate alias "${alias}" found for link with href = "${href}" </span>`); } else { aliases.add(alias); } };
效果验证
对于示例中的HTML结构:
<!--[if mso]> <a href="https://www.w3schools.com" alias="test">Visit W3Schools</a> <![endif]--> <a href="https://www.w3schools.com" alias="test">Visit W3Schools</a>
- mso注释内的
<a>节点会被检测到处于注释块内,跳过重复检查 - 外部的
<a>节点正常检测,由于此时aliases集合中没有"test",会将其加入集合,不会触发重复报错
内容的提问来源于stack exchange,提问作者norrinradd
相关产品推荐
相关产品推荐

