JS检查主机名是否存在于数组的Chrome扩展代码为何不生效
问题排查与修正
首先针对你提出的两个疑问,直接给出结论:
window.location.hostname的返回值固定为字符串类型,不存在其他类型的可能,无需额外做类型兼容判断。- 数组的
indexOf()方法采用严格相等(===)规则匹配元素,你当前数组元素全部为字符串类型,和hostname的类型一致,完全可以正常匹配,不存在“indexOf无法匹配字符串”的问题。
导致逻辑异常的核心错误
indexOf()返回值判断逻辑完全用错
该方法的返回值规则为:若目标元素存在于数组中,返回对应元素的索引下标(从0开始计数,比如你数组第一个元素sciencedirect.com的索引是0,第二个ncbi.nlm.nih.gov的索引是1,最后一个ci.nii.ac.jp的索引是4);若目标元素不存在于数组中,固定返回-1。
你当前写的判断条件ac_websites.indexOf(hostname) != 1,等价于“只要当前主机名不是列表里的第二个元素,就执行打开Google的逻辑”,完全偏离了“判断主机名是否在学术网站列表中”的初始需求。- 域名匹配规则和实际场景不匹配
你数组中存储的是裸域名,但实际访问对应学术站点时,window.location.hostname返回的是带前缀的完整主机名——比如访问ScienceDirect的正常页面时,hostname会返回www.sciencedirect.com,和你数组里存储的sciencedirect.com是完全不同的字符串,哪怕修正了indexOf的判断条件,也会因为字符串全等匹配失败,无法正确识别站点。 - 业务分支逻辑写反
按照你else分支的提示语“Not an academic website”,你本意应该是“匹配到非学术网站时触发对应提示/跳转逻辑”,但你当前的分支触发条件和提示语是完全错位的。
可正常运行的参考代码
const ac_websites = ["sciencedirect.com", "ncbi.nlm.nih.gov", "pubmed.ncbi.nlm.nih.gov", "ieeexplore.ieee.org", "ci.nii.ac.jp"] chrome.runtime.onMessage.addListener(function (request) { const url = document.location.href const hostname = window.location.hostname // 支持子域名的学术站点匹配判断 const isAcademicSite = ac_websites.some(domain => { return hostname === domain || hostname.endsWith(`.${domain}`) }) // 根据实际业务调整分支逻辑即可 if (!isAcademicSite) { // 非学术站点弹出对应提示 alert("Not an academic website") } else { // 匹配到学术站点时执行跳转逻辑 window.open("https://google.com/" + url); } })
注:上述代码中使用endsWith做后缀匹配,可以正确识别学术域名下所有带www、多级子域名的访问场景,避免因主机名前缀不同导致匹配失败。因你原代码中分支的触发条件和提示语存在错位,可根据实际业务需求调整两个判断分支内的执行逻辑。
内容的提问来源于stack exchange,提问作者Polymood
相关产品推荐
相关产品推荐

