重构前端 JS 逻辑