- ```html
网页脚本怎么写 网页脚本怎么写
写网页脚本,第一件事不是脚本打开编辑器敲代码,而是网页搞清楚它跑在哪儿。浏览器里的脚本 JavaScript 和 Node.js 里的 JavaScript 看着像亲兄弟,实际上脾气差很远。网页浏览器脚本能直接摸到
document、脚本window,网页能改页面、脚本弹窗、网页发请求;Node 脚本则去读写文件、脚本开服务器。网页你要是脚本把document.write扔进 Node 里,它只会给你一个冷漠的网页ReferenceError。所以先问自己:这个脚本是脚本要在用户浏览器里蹦跶,还是网页在服务器上默默干活?答案不同,写法完全两样。下面聊的主要是浏览器里的脚本,毕竟大多数人说的“网页脚本”就是这个意思。
从一行代码开始
别急着写
function和class。先打开一个 HTML 文件,在<body>结束标签前塞进一对<script>标签:<script> alert('嘿,我跑起来了'); </script>刷新页面,弹窗出来,说明脚本位置对了。为什么放
</body>前面?因为浏览器从上往下解析 HTML,脚本放太早,它想操作的按钮还没出生呢。你写document.querySelector('#btn')只会拿到null,然后报错。这坑我踩过无数次,现在养成了习惯——要么把脚本放底部,要么给<script>加上defer属性。操作页面:别只会 getElementById
新手最爱
document.getElementById('foo'),但它只能按 ID 找。实际项目里更常用querySelector和querySelectorAll,它们吃 CSS 选择器,灵活得多。比如你想给所有带.card类的元素加个点击效果:const cards = document.querySelectorAll('.card'); cards.forEach(card => { card.addEventListener('click', () => { card.classList.toggle('active'); }); });注意
querySelectorAll返回的是 NodeList,不是数组。老版本浏览器里它没有forEach,得用Array.from()转一下。现在基本不用管了,但如果你要兼容 IE……祝你好运。事件监听:别把 onclick 当亲爹
行内写法
<button onclick="doSomething()">看着方便,实际上把 HTML 和 JS 搅成一锅粥。改个函数名得满文件搜,而且同一个元素只能绑一个onclick,后绑的会覆盖前面的。用addEventListener干净得多,还能绑多个:const btn = document.querySelector('#submit'); btn.addEventListener('click', handleSubmit); btn.addEventListener('click', logClick); // 两个都会执行有个细节:
addEventListener的第三个参数可以传{ once: true },让监听器只触发一次。做一次性弹窗或者初始化逻辑时特别省心,不用手动removeEventListener。异步请求:fetch 比 XMLHttpRequest 香
以前写 AJAX 要
new XMLHttpRequest(),然后监听onreadystatechange,判断readyState === 4,再检查status === 200……一套下来十几行没了。现在用fetch清爽得多:fetch('/api/user') .then(res => { if (!res.ok) throw new Error('请求翻车了'); return res.json(); }) .then(data => console.log(data)) .catch(err => console.error(err));或者用
async/await写得更像同步代码:async function loadUser() { try { const res = await fetch('/api/user'); const data = await res.json(); document.querySelector('#name').textContent = data.name; } catch (err) { console.error('加载失败', err); } }注意
fetch只在网络错误时 reject,HTTP 404 或 500 它照样 resolve。所以必须手动检查res.ok,不然你会拿到一个空对象然后一脸懵。个人踩坑: 有次写了个脚本,本地测试全过,上线后用户反馈按钮没反应。查了半天发现是脚本里用了?.可选链,而那个用户的浏览器是旧版 Safari。所以写完脚本,最好在目标浏览器里过一遍,或者用 Babel 转译一下。调试:console.log 不丢人
别觉得用
console.log调试低级。Chrome DevTools 里console.table打印数组对象更直观,console.time和console.timeEnd能测性能,debugger语句直接断点。我见过有人写alert调试,弹窗点到手软,那才叫折磨。还有,打开 DevTools 的 Sources 面板,在代码行号上点一下就能下断点,比满屏
console.log高效多了。变量值、调用栈、作用域链一目了然。最后说一嘴模块化
脚本一多,全塞进一个
<script>里就是灾难。用type="module"把代码拆成多个文件,通过import和export组织:<script type="module" src="main.js"></script>然后在
main.js里import { init } from './utils.js'。模块默认是延迟执行的,不会阻塞 HTML 解析,而且每个模块有自己的作用域,不会污染全局。现代浏览器都支持,放心用。写网页脚本没什么高深魔法,就是多写、多踩坑、多打开 DevTools 看。你盯着控制台报错改上十遍,比看一百篇教程都管用。
``` 顶: 97踩: 236






评论专区