实现功能
- 点击登录按钮,ajax.load方式加载登录模块;
- 点击X按钮,关闭面板;
- 点击注册按钮,ajax.load方式加载注册模块。
原代码:
$(function(){
//加载登录模块
$("#login_a").click(function(){
$("body").prepend("<div id='login_prepend'></div>");
$("#login_prepend").load('/index/login.html',function(){
//移除登录模块
$("#close img").click(function(){
$("#login_prepend").remove();
})
//载入注册模块
$("#registe").click(function(){
$("#login_prepend").load('/index/registe.html',function(){
//移除注册模块
$("#close img").click(function(){
$("#login_prepend").remove();
})
});
})
});
})
})
原代码存在的问题
- 代码重复:移除模块的代码在登录模块和注册模块加载时都有重复。
- 缺少错误处理:
load方法在加载失败时没有相应的错误提示和处理逻辑。 - 事件绑定问题:事件绑定没有使用事件委托,对于动态加载的元素,后续添加元素时可能无法正确绑定事件。
- 代码结构:代码结构不够清晰,功能模块划分不明确。
优化后的代码
$(function () {
// 封装加载模块的函数
function loadModule(moduleUrl) {
// 若已有登录模块则移除
$('#login_prepend').remove();
// 在 body 前添加登录模块容器
$("body").prepend("<div id='login_prepend'></div>");
// 加载模块内容
$("#login_prepend").load(moduleUrl, function (response, status, xhr) {
if (status === "error") {
console.error(`加载模块失败: ${xhr.status} ${xhr.statusText}`);
// 加载失败移除容器
$('#login_prepend').remove();
}
});
}
// 事件委托处理关闭模块操作
$('body').on('click', '#close img', function () {
$('#login_prepend').remove();
});
// 事件委托处理切换到注册模块操作
$('body').on('click', '#registe', function () {
loadModule('/index/registe.html');
});
// 绑定登录按钮点击事件
$("#login_a").click(function () {
loadModule('/index/login.html');
});
});
优化说明
-
封装函数:将加载模块的逻辑封装到
loadModule函数中,避免代码重复,提高代码的可维护性和复用性。 -
错误处理:在
load方法的回调函数中添加错误处理,当加载模块失败时,会在控制台输出错误信息并移除加载模块的容器。 -
事件委托:使用
$('body').on()方法进行事件委托,将关闭模块和切换到注册模块的事件处理程序绑定到body元素上,确保动态加载的元素也能正确响应事件。 -
代码结构:将不同功能的代码进行分离,使代码结构更加清晰,易于理解和维护。
通过这些优化,代码的健壮性和可维护性都得到了显著提升。