一个留言板的板添核心操作就两个:把用户输入的内容塞进列表,再给每条内容配个删除按钮。加和听起来简单,删除但做起来全是板添坑——尤其是你打算纯用JavaScript操作DOM的时候。
我先说添加。加和最常见的删除做法是监听表单的submit事件,阻止页面刷新,板添然后读取输入框的加和值,创建一个新的删除li元素,用innerHTML或者textContent把内容填进去,板添最后appendChild到ul里。加和这里有个细节容易被忽略:如果你用innerHTML插入用户输入的删除内容,用户输入一段“<img src=x onerror=alert(1)>”,板添你的加和留言板就变成了XSS攻击演示台。所以要么用textContent,删除要么老老实实把特殊字符转义。我见过不少新手栽在这上面,测试的时候自己输入正常文字没问题,一换特殊字符就崩。
删除就更直接了。给每个删除按钮绑定click事件,找到它对应的那条留言的父元素,然后removeChild。但这里有个性能上的小讲究——如果你删除的是列表中间的一项,用removeChild会触发浏览器的重排,如果列表很长,频繁删除会卡。更顺滑的方式是先把要删的元素隐藏或打标记,然后批量操作。不过对个人项目来说,直接删也够用,别过度设计。
还有一点,很多人会忽略事件委托。你给每条留言的删除按钮单独绑定事件,如果留言是动态添加的,新按钮不会自动绑定——除非你在添加函数里同时绑事件。这逻辑绕来绕去容易乱。不如直接在ul上监听click,判断点击的目标是不是删除按钮,是的话就往上找父元素删掉。这样无论之后加多少条留言,都不用再管事件绑定的事。代码量少一半,还不会出漏绑定的bug。
我自己的一个教训是:留言板的数据别只存在DOM里。你刷新页面,内容就没了。要么接localStorage,要么接后端接口。哪怕只是存个纯文本的数组,也比裸DOM强。我见过有人做了个挺漂亮的留言板,结果一刷新全清空,用户骂街。数据持久化才是留言板的灵魂,增删只是皮囊。
最后说个容易翻车的地方:删除时索引错位。如果你用splice删数组里的元素,而你的渲染函数是根据数组长度循环生成DOM的,那删完一条后,后面的索引会往前挪。此时如果你还拿着旧索引去操作,就会删错对象。解决方式很简单——给每条留言一个唯一的id,操作时用id定位,而不是用数组下标。这个习惯养成了,以后做更复杂的前端列表也不会踩坑。
写留言板练手是个好选择,它逼你把事件、DOM操作、数据存储都过一遍。但别停留在“能跑就行”,多想想边界情况——空内容能不能提交?删除时要不要确认?连续快速点击会不会出bug?把这些想清楚了,你才算真的会写。