You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS检查主机名是否存在于数组的Chrome扩展代码为何不生效

问题排查与修正

首先针对你提出的两个疑问,直接给出结论:

  • window.location.hostname的返回值固定为字符串类型,不存在其他类型的可能,无需额外做类型兼容判断。
  • 数组的indexOf()方法采用严格相等(===)规则匹配元素,你当前数组元素全部为字符串类型,和hostname的类型一致,完全可以正常匹配,不存在“indexOf无法匹配字符串”的问题。

导致逻辑异常的核心错误

  1. indexOf()返回值判断逻辑完全用错
    该方法的返回值规则为:若目标元素存在于数组中,返回对应元素的索引下标(从0开始计数,比如你数组第一个元素sciencedirect.com的索引是0,第二个ncbi.nlm.nih.gov的索引是1,最后一个ci.nii.ac.jp的索引是4);若目标元素不存在于数组中,固定返回-1。
    你当前写的判断条件ac_websites.indexOf(hostname) != 1,等价于“只要当前主机名不是列表里的第二个元素,就执行打开Google的逻辑”,完全偏离了“判断主机名是否在学术网站列表中”的初始需求。
  2. 域名匹配规则和实际场景不匹配
    你数组中存储的是裸域名,但实际访问对应学术站点时,window.location.hostname返回的是带前缀的完整主机名——比如访问ScienceDirect的正常页面时,hostname会返回www.sciencedirect.com,和你数组里存储的sciencedirect.com是完全不同的字符串,哪怕修正了indexOf的判断条件,也会因为字符串全等匹配失败,无法正确识别站点。
  3. 业务分支逻辑写反
    按照你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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 05:27:01