技术解析

同一个脚本放在 body 里面可以运行 放到外部 js 文件报错
0
2021-08-11 05:14:29
idczone
  • 前端基本不懂 也没用框架
  • 一个脚本在 Body 里面可以正常运行

function jinshen() {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === 4 && request.status === 200) {
            var info = request.responseText;
            var js = JSON.parse(info);

            var j1 = js.JinShen1;
            var j2 = js.JinShen2;
            var j3 = js.JinShen3;
            var jinsheninfo = j1 + "
" + j2 + "
" + j3; var p = document.getElementById("y1"); p.innerHTML = jinsheninfo; }; }; // 发送请求: request.open('POST', '/xxx', true); request.send(); }
  • 放到外部 js 文件目录里面就报错
xxx:15 Uncaught ReferenceError: jinshen is not defined
    at HTMLButtonElement.onclick (xxx:15)
  • 也会这样报错
Uncaught SyntaxError: Unexpected token '<'

  • 网上搜了一下也找不出个所以然来 这问题原因出在哪里呢?

你的 js 路径写错了

src=“js/xxx.js”不是这样吗? js 目录在项目根目录下

检查控制台 network,看看 js 文件有没有正常请求到

network-->ALL Status 都是 200


这是请求到了吧
```
Request URL: http://127.0.0.1:9090/js/yiji.js
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:9090
Referrer Policy: no-referrer-when-downgrade
Content-Type: text/html; charset=utf-8
Date: Tue, 29 Dec 2020 15:03:06 GMT
Transfer-Encoding: chunked
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Connection: keep-alive
Cookie: remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6Im9sWWFhdTNTOWpCTFlPV2J0SHV6NXc9PSIsInZhbHVlIjoiUnJBbUtwS2VsRW11aXZTNkJEeFVQWWd2SmFZT1lHRURIVzRQN1VzUUxOQVwvM2dKYVQ2N0VCUURHcGVOdDJROVdyZzFldkdOaDcycDQ3ZDhqVStxcFVZaFV4U0N2S0lYSjg1K0djcXp6TE9INDFVZzZ3cVZNbWQzMFZNTXdCZlZMSTZzTVY3OFZDV0VqXC85SG1vUnhReExnVVwvRUVrYmdWK0ZFUHdpYk40T0FrYzRtd01vRlJmbnRpUkViNEtBV2hIIiwibWFjIjoiNzQxMTY1N2RmMDFhNzBkYmQyMjRkMzY2MTlkZjMwY2I2OGVkZGQ2YTlmYmJmOGZlNDIyMjg1ZjYyOGEzNWY0NyJ9; CSRF-Token-PBX43=MbUAFxPTqikYRgErQScXUuRFLe4XAijK; PHPSESSID=7v3dn9n3efn6h797en57n3n19u; _ga=GA1.1.30054837.1559550150; counter=181
dnt: 1
Host: 127.0.0.1:9090
Referer: http://127.0.0.1:9090/ccal
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-origin
sec-gpc: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
```

Content-Type: text/html

Content-Type 有问题

这怎么改 有办法吗?

就第二个错误来看,像是 js 里不小心混进 html 代码了

js 代码就是上面帖的这个...

加一句 request.setRequestHeader("Content-type","application/json");

加了也不行.....

看一下上面请求的 response 内容和原本的 js 文件一样吗?

不一样 network-All-Response 里面是另一个 html 页面的内容

那这应该是 web 服务器的问题,具体要看你静态文件服务器是什么、怎么配置的了

无关 Content Type,据我分析是 DOM 未加载完成就调用了这个 jinshen 函数,提升引用外部 script 在页面中的顺序即可。

head 里面引用也不行 晕

提供的信息不够,也可以把 HTML 结构贴出来。







吉凶宜忌













看一下 js 文件请求的返回内容,是不是你的 js 文件内容。控制台 network 标签页,js 文件的请求,点进去看 preview


func main() {
flag.Usage = func() {
fmt.Println("usage ccal-web -l port")
flag.PrintDefaults()
}
p := flag.Int("l", 9090, "")
flag.Parse()
fmt.Println("https://github.com/Aquarian-Age/ccal-gui/tree/master/web 下载 webUI 页面")
http.HandleFunc("/", home)
http.HandleFunc("/ccal", yiJi)
http.HandleFunc("/today", todayInfo)
http.HandleFunc("/jz60", selectlist)
port := fmt.Sprintf(":%d", *p)
err := http.ListenAndServe(port, nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
yiji.js 文件请求的竟然是主页页面 而不是 ccal 页面.....

Uncaught SyntaxError: Unexpected token '<'
这个报错有时候可能是你引用的 js 包的 src 地址为空导致的。建议检查一下看看有没有引用外部的 script 标签里的 src 是空的,这个错误没法靠调试查出问题

同一个脚本放在 body 里面可以运行 放到外部 js 文件报错
不看代码,盲猜你的这段 JS 代码应该使用 DOMContentLoaded 事件在页面加载完成再触发
简单点就是把你的这个函数放 window.onload = function(){ xxxxxxxxxxxxx } xxxxx 就是你的代码

外部引用的 script 标签内部不要放任何东西,其他 js 再写一个没有外部引用的 script 标签放进去

Content-Type: text/html; charset=utf-8 ;你这个有点问题吧

network 》 yiji.js 》 response 里面看看返回的什么

1. 先调试一下路由,确保确实能请求到 js 文件
2. 保证 js 脚本在页面加载完成后运行

29 楼已经写了

两个没发现问题 因为就一个路由

没看懂
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服